Java入門學習-實踐:手動輸入城市名稱5次,完成後輸出一份city.txt文件,寫出被輸入最多次的城市名字

gongjinsi發表於2017-05-09

一、初始版

import java.awt.MenuComponent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class MostCity {
    private File f=new File("F:/java/HelloWorld/src/practice/city.txt");
    Scanner scanner=new Scanner(System.in);

    public  String maxtimes(ArrayList<String> arrayList){   //求最大次數的方法
        HashMap<String,Integer> hm=new HashMap<>();    //建一個Hashmap記錄鍵(String)對應的次數
        for(int i=0;i<arrayList.size();i++){     //將每個arraylist put到HashMap中
            if(hm.get(arrayList.get(i))!=null)    //沒加過就置為1,加過就在原始的基礎上+1
                hm.put(arrayList.get(i), hm.get(arrayList.get(i))+1);
            else hm.put(arrayList.get(i), 1);
        }
        int max=0;
        Iterator it=hm.entrySet().iterator();    //建立一個迭代器,用於下面找最大值遍歷
        while(it.hasNext()){
            Entry entry=(Entry)it.next();     //百度上說Map.Entry的效率要高一些
            if(max<(int)entry.getValue()){    //打擂臺法找到最大值
                max=(int)entry.getValue();
            }       
        }
        String string="Peking  "+max+"  times"; 
        return string ;
    }
    public void file(ArrayList<String> arrayList){    //建立檔案的方法
        try {
            f.createNewFile();    //如果路徑不在,就新建一個路徑
            FileOutputStream fops=new FileOutputStream(f); 
            for(int i=0;i<arrayList.size();i++){
                String s=arrayList.get(i)+"\r\n";   //加上換行,沒有\r,記事本就不換行
                fops.write(s.getBytes());    //寫到檔案流中
            }
            fops.close();    //關閉流
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public  void getcity(ArrayList<String> arrayList){   //從控制檯獲取city方法
        String string=scanner.nextLine();
        arrayList.add(string);        //add方法新增到ArrayList中
    }
    public static void main(String[] args) {
        MostCity mostCity=new MostCity();
         //ArrayList< String> arrayList=null; //之前因為寫了這句話,沒有初始化,所以會丟擲空指標異常java.lang.NullPointerException
        ArrayList< String> arrayList=new ArrayList<String>();
        for(int i=0;i<5;i++){                      //輸入5次
            mostCity.getcity(arrayList);
        }   
        mostCity.file(arrayList);
        System.out.println(arrayList);
        System.out.println(mostCity.maxtimes(arrayList));
    }
}

輸入:
北京
上海
廣州
北京
拉薩

輸出:
[北京, 上海, 廣州, 北京, 拉薩]
Peking 2 times

檔案寫於F:/java/HelloWorld/src/practice/city.txt中
檔案內容為:
北京
上海
廣州
北京
拉薩

二、修改版

import java.awt.MenuComponent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class MostCity {
    private File f=new File("F:/java/HelloWorld/src/practice/city.txt");
    Scanner scanner=new Scanner(System.in);

    public  void maxtimes(ArrayList<String> arrayList){   //求最大次數的方法
        HashMap<String,Integer> hm=new HashMap<>();    //建一個Hashmap記錄鍵(String)對應的次數
        for(int i=0;i<arrayList.size();i++){     //將每個arraylist put到HashMap中
            if(hm.get(arrayList.get(i))!=null)    //沒加過就置為1,加過就在原始的基礎上+1
                hm.put(arrayList.get(i), hm.get(arrayList.get(i))+1);
            else hm.put(arrayList.get(i), 1);
        }
        int max=0;
        Set<String> maxvalue=new HashSet() ;
        Iterator it=hm.entrySet().iterator();    //建立一個迭代器,用於下面找最大值遍歷
        while(it.hasNext()){
            Entry entry=(Entry)it.next();     //百度上說Map.Entry的效率要高一些
            if(max<(int)entry.getValue()){    //打擂臺法找到最大值
                max=(int)entry.getValue();
            }
            for(String key:hm.keySet()){     //反向將最大值的所有key找出來,放到set裡去重
                if(hm.get(key).equals(max)){
                    maxvalue.add(key);
                }
            }
        }
        for(String s:maxvalue){     //輸出set及最大值
            System.out.println(s+"  "+max+"  times");
        }
    }
    public void file(ArrayList<String> arrayList){    //建立檔案的方法
        try {
            f.createNewFile();    //如果路徑不在,就新建一個路徑
            FileOutputStream fops=new FileOutputStream(f); 
            for(int i=0;i<arrayList.size();i++){
                String s=arrayList.get(i)+"\r\n";   //加上換行,沒有\r,記事本就不換行
                fops.write(s.getBytes());    //寫到檔案流中
            }
            fops.close();    //關閉流
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public  void getcity(ArrayList<String> arrayList){   //從控制檯獲取city方法
        String string=scanner.nextLine();
        arrayList.add(string);        //add方法新增到ArrayList中
    }
    public static void main(String[] args) {
        MostCity mostCity=new MostCity();
         //ArrayList< String> arrayList=null; //之前因為寫了這句話,沒有初始化,所以會丟擲空指標異常java.lang.NullPointerException
        ArrayList< String> arrayList=new ArrayList<String>();
        for(int i=0;i<5;i++){                      //輸入5次
            mostCity.getcity(arrayList);
        }   
        mostCity.file(arrayList);
        System.out.println(arrayList);
        mostCity.maxtimes(arrayList);
    }
}

輸入:
北京
上海
廣州
深圳
長沙

輸出:
[北京, 上海, 廣州, 深圳, 長沙]
上海 1 times
廣州 1 times
長沙 1 times
北京 1 times
深圳 1 times

————————————————–

輸入:
北京
上海
北京
上海
廣州

輸出:
[北京, 上海, 北京, 上海, 廣州]
上海 2 times
北京 2 times

三、再優化
在找最大值的鍵時,之前使用迭代器遍歷,多條一直只輸出一條,所以就用了set。今天一看程式碼,放錯位置了,所以寫程式碼時還是要清醒。
重新改了一下這一段

for(String key:hm.keySet()){     //反向將最大值的所有key找出來,放到set裡去重
                if(hm.get(key).equals(max)){
                    maxvalue.add(key);
                }
            }
for(String s:maxvalue){     //輸出set及最大值
            System.out.println(s+"  "+max+"  times");
        }

改為:

//for迴圈就要從key遍歷。如果從value遍歷,則會有多條產生
for(String s:hm.keySet()){
            if(hm.get(s).equals(max)){
                System.out.println(s+"   "+max+"  times");
            }
        }

相關文章