1. 程式人生 > 實用技巧 >讓Go無路可go的十個

讓Go無路可go的十個

此作業的要求參見[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: