2013-10-17 33 views
0

我有一份工作正在進行中。我製作了兩個陣列,一個保存每個獨特單詞,一個統計每個獨特單詞的使用次數。 現在我需要找到最高值的數組,意思是最常用的單詞,然後打印出屬於該類別的每個單詞:從那裏開始使用的前十個單詞。我做了一次嘗試,但沒有找到最高價值的部分。 (如果有人可以給我一個關於如何讓程序讀取文本和保存單詞沒有逗號,斜槓等的提示,請做)打印文本中使用的前10%的文字

我不允許使用HashMaps,對此抱歉。忘了提及。

的代碼:

import java.util.*; 
import java.io.*; 

class Oblig3B{ 
    public static void main(String[]args){ 

    OrdAnalyse oa = new OrdAnalyse(); 
    String filArgs=args[0]; 
    oa.analyseMetode(filArgs); 
    } 
} 

class OrdAnalyse{ 
    void analyseMetode(String filArgs){ 

    //Begynner med aa opprette alle variabler som trengs, disse deklareres rett under. De ligger her oppe bare for at jeg skal ha oversikten over de. 
    Scanner input, innfil; 
    String[] ord; 
    int[] antall; 
    int antUnikeOrd, antOrd; 
    PrintWriter utfil; 
    boolean sjekk; 

    //Deklarerer alle bortsett fra de som har med fil aa gjore, disse deklareres inne i en try-catch-loop (printwriter utfil og scanner innfil). 
    input=new Scanner(System.in); 
    ord=new String[5000]; 
    antall=new int[5000]; 
    antUnikeOrd=0; 
    antOrd=0; 
    sjekk=true; 

    try{ 
     innfil=new Scanner(new File(filArgs)); 
     //Naa sjekker programmet om ordet som blir lest med Scanner-metoden er lest for. Er det slik, saa oeker den antallet i samme index i antall-arrayen med 1, den boolske verdien sjekk blir true, og neste if-lokke vil ikke kjore, for loopen er ferdig og neste ord leses. 
     //Here it reads the file, word by word. 
     while(innfil.hasNext()){ 
     String ordLest=innfil.next().toLowerCase(); 
     sjekk=false; 
      for(int i=0; i<ord.length; i++){ 
      if(ordLest.equals(ord[i])){ 
      antall[i]+=1; 
      sjekk=true; 
      } 
     } 
     if(!sjekk){ 
      //Her vil lokken oke telleren antUnikeOrd med en for hvert unike ord som leses, og denne er alltid en 
      ord[antUnikeOrd]=ordLest; 
      antall[antUnikeOrd]++; 
      antUnikeOrd++; 
     } 

     antOrd++; 
     } 
     innfil.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 


    try{ 
     utfil=new PrintWriter(new File("Oppsummering.txt")); 

     utfil.println("Antall ord lest: " +antOrd+ " og antall unike ord: "+antUnikeOrd+"  "+ ord.length); 

     finnOrd(antall, ord, utfil); 

     for(int i=0; i<ord.length; i++){ 
     utfil.println(ord[i]+(" ")+antall[i]); 
     } 

     utfil.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 

//This is the method where I will find the top ten percent most used words. 

    void finnOrd(int[] antall, String[] ord, PrintWriter utfil){ 
    int teller=1000; 
    for(int i=0; i<ord.length; i++){ 
     if(antall[i]>teller){ 
     teller=antall[i]; 
     } 
     //Naa er teller lik den hoyeste verdien i antall-arrayen. 
     double tiprosent=teller*0.90; 
     System.out.println(tiprosent + " " + teller); 
     for(i=0; i<ord.length; i++){ 
     if(antall[i]>tiprosent){ 
      utfil.println("Vanlige ord: "+ord[i]+"\t("+antall[i]+" forekomster)"); 
     } 
     } 
    } 
    } 
} 
+1

爲什麼不使用LinkedHashMap然後使用自定義比較器對它進行排序? – Gustavo

回答

0

在@Gustavo他的評論說,把它們放在一個散列像MyHash<string, int>,然後通過Value

+0

忘記補充說明:不允許使用hashmaps – Makri

0

antall [antUnikeOrd] ++訂購MyHash; antUnikeOrd ++;

你能向我解釋一下這些人在幹什麼嗎?還有antall [i] + = 1; 上面是幹什麼的?這聽起來像是你可能重複了這項工作,但我在理解某些語言方面遇到了一些麻煩,所以很難說清楚。

但是,如果這是重複它,它實際上並不重要,因爲它是平等地加倍一切!

我在你的finnOrd方法中看到你,你以int teller = 1000開頭;

出納員是任意的,還是你知道的某些會出現10000個單詞?我知道你的數組是這個長度,但是你不確定是否每個元素都被填充(除非這是特別說明的一部分)。如果你不確定,那麼你有更好的度量來確定10%是什麼 - antUnikeOrd正在計算獨特的單詞,所以獨特單詞數量的10%將正確地給你你需要的東西。

現在有幾種方法可以實際找到單詞 - 你可以使用哈希,就像已經提出的那樣,但我的想法可能是你不允許。

你只想通過結果列表一次,所以你可以創建一個數組[10],它可以存儲最高評分的最後10個單詞。

您也可以花時間瞭解排序,並研究如何對數組進行排序 - 在這一點上,您只需提取前十項內容。

你可能會以非常低效的方式去遍歷數組十次,每次都拉出頂部的單詞並將其設置爲零。作爲一個真正的選擇,這不是一件好事,但我把它扔到那裏,所以你可以開始思考你可以嘗試解決這個問題的不同方式。

+0

antall [i] + = 1在antall-array中添加一個,其中存儲每個唯一字在文件中註冊的數量。另外兩個將在索引中的數組中註冊一個單詞,當前最大計數唯一字的值在該索引處,如果該單詞當前不存在於數組中,並且antall [antUnikeOrd] ++將一個值添加到antall在相同的索引下,開始計算每個詞的出現次數。不,這只是設置出納員的東西。我試圖用它作爲一個值來讓for循環開始。 – Makri

相關問題