Java入門學習-實踐:手動輸入城市名稱5次,完成後輸出一份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.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");
}
}
相關文章
- Java 輸入輸出流Java
- JAVA輸入輸出流Java
- 重學java中的輸入輸出流Java
- c++入門:輸入輸出流C++
- 用javascript完成pos機的輸入輸出JavaScript
- Java —— 標準輸入輸出Java
- Java基礎輸入輸出Java
- 輸入輸出
- Java------簡單的輸入/輸出Java
- Java中的輸入輸出總結Java
- 輸入輸出流
- Java I/O系統學習系列二:輸入和輸出Java
- 直播app原始碼,Java的輸入輸出APP原始碼Java
- JAVA筆記(12)——輸入和輸出Java筆記
- java_檔案輸入與輸出Java
- 資料的輸入輸出
- Python的輸入輸出Python
- Nucleo入門--004通用輸入輸出
- linux中的輸入與輸出管理(重定向輸入,輸出,管道符)Linux
- C++中的檔案輸入/輸出(3):掌握輸入/輸出流 (轉)C++
- 物聯網學習教程——格式輸入與輸出
- C++ 學習筆記之——輸入和輸出C++筆記
- 【C++】輸入輸出C++
- 輸入輸出系統
- 編寫安全的驅動程式之輸入輸出檢查
- 初學Python(六)——輸入輸出Python
- 詳解Java中的IO輸入輸出流!Java
- java中基本輸入輸出流的解釋Java
- 輸入一個3,輸出March,輸入一個數字月份,然後對應輸出相應的英文表示,用指標陣列完成指標陣列
- 01_Numpy學習筆記(下):輸入和輸出筆記
- 排序,檔案輸入輸出排序
- 03 資料輸入-輸出
- Python 輸入和輸出Python
- 檔案操作-輸入輸出
- C語言輸入輸出C語言
- 常用輸入輸出函式函式
- C語言之輸入輸出C語言
- C++名稱空間、標準輸入輸出、引用C++