讓Go無路可go的十個
阿新 • • 發佈:2020-09-23
此作業的要求參見[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206]
詞頻統計 SPEC
老五在寢室吹牛他熟讀過《魯濱遜漂流記》,在女生面前吹牛熱愛《呼嘯山莊》《簡愛》和《飄》,在你面前說通讀了《戰爭與和平》。但是,他的四級至今沒過。你們幾個私下商量,這幾本大作的單詞量怎麼可能低於四級,大家聽說你學習《構建之法》,一致推舉你寫個程式名字叫wf,統計英文作品的單詞量並給出每個單詞出現的次數,準備用於打臉老五。
希望實現以下效果。以下效果中數字純屬編造。
功能1 小檔案輸入。 為表明程式能跑,結果真實而不是迫害老五,請他親自鍵盤在控制檯下輸入命令。
這一功能的需要我們去讀取檔案,然後對讀取後的檔案進行切割操作。
難點:對於讀取到的資料陣列,找出重複的單詞,我使用HasMap來進行儲存,單詞第一齣現放入Hash Map中,Key為單詞,value為1,當出現重複單詞時value加1。
重要檔案讀取程式碼如下:
public static String fileRead(String name) throws Exception { File file = new File(name); FileReader reader = new FileReader(file); BufferedReader bReader = new BufferedReader(reader); StringBuilder sb = new StringBuilder(); String s = ""; while ((s =bReader.readLine()) != null) { sb.append(s); } bReader.close(); String str = sb.toString(); return str; }
通過HashMap來對讀取到的字元陣列進行處理,程式碼如下:
public static void deal(String[] word,int len){ int len2=0; HashMap<String,Integer> map=new HashMap<String,Integer>(); for(int i=0;i<len;i++){int sight=0; len2=map.size(); if(len2==0){ map.put(word[i],1); } else{ for (Map.Entry<String, Integer> vo : map.entrySet()) { if(vo.getKey().equals(word[i])){ map.put(vo.getKey(),vo.getValue()+1); sight=1; break; } } if(sight==0) map.put(word[i],1); } } System.out.printf("total %2d words\n",map.size()); List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); list.sort(new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); } }); map.put(null,null); int temp=0; for (Map.Entry<String, Integer> mapping : list){ temp++; if(temp==10) break; System.out.printf("%-15s%2d\n",mapping.getKey(),mapping.getValue()); } }
功能2支援命令列輸入英文作品的檔名,請老五親自錄入
重要程式碼片段:
public static void function1(String arg){ int len=0;
String txt="";
String name=arg+".txt";
try{
txt=fileRead(name);//fileRead函式已在功能一中插入,在此不再重複
}catch(Exception e){
e.printStackTrace();
}
System.out.println(txt);
txt=txt.replaceAll("[\\pP\\p{Punct}]", " ");
String[] word=txt.split(" +");
len=word.length;
deal(word,len); //deal函式已在功能一中插入,在此不再重複。
}
功能3支援命令列輸入儲存有英文作品檔案的目錄名,批量統計。
重要程式碼片段:
public static void function3(String arg){ String filepath=""; filepath="E:\\GIT\\cangku\\yang\\"+arg+"\\"; ArrayList<String> files = new ArrayList<String>(); File file = new File(filepath); File[] tempLists = file.listFiles(); for (int i = 0; i < tempLists.length; i ++) { if (tempLists[i].isFile()) {
files.add(tempLists[i].toString()); } } for (int i = 0; i < files.size(); i++) { control(files.get(i)); System.out.println("--------------------------------------------------"); } }
public static void control(String name){ int len=0; String txt=""; System.out.println(name.substring(24)); try{ txt=fileRead(name); }catch(Exception e){ e.printStackTrace(); } txt=txt.replaceAll("[\\pP\\p{Punct}]", " "); String[] word=txt.split(" +"); len=word.length; deal(word,len); }
功能4從控制檯讀入英文單篇作品,這不是為了打臉老五,而是為了向你女朋友炫酷,表明你能提供更適合嵌入指令碼中的作品(或者如她所說,不過是更靈活的介面)。如果讀不懂需求,請教師兄師姐,或者 bing: linux 重定向,儘管這個功能在windows下也有,搜尋關鍵詞中加入linux有利於迅速找到。
功能四效果如下:
重要程式碼片段如下:
public static void function4(){ int len=0; Scanner sc=new Scanner(System.in); String txt=""; txt=sc.nextLine(); String[] word=txt.split(" |\\.|,"); len=word.length; deal(word,len); }
PSP: