2016-07-29 23 views
1

Ich möchte eine Datei lesen, und möchte n Wörter zu sammeln, hängt von Worthäufigkeit ab.Suche nach 'n' häufigsten Wörtern aus einer Datei mit Java?

Ich habe den folgenden Code versucht, um alle Wörter in einer Zeichenfolge zu zählen.

public static void main(String[] args) throws FileNotFoundException, IOException { 
    FileReader fr = new FileReader("txtFile.txt"); 
    BufferedReader br = new BufferedReader(fr); 
    String text = ""; 
    String sz = null; 
    while ((sz = br.readLine()) != null) { 
     text = text.concat(sz); 
    } 
    String[] words = text.split(" "); 
    String[] uniqueLabels; 
    int count = 0; 
    System.out.println(text); 
    uniqueLabels = getLabels(words); 

    for (String l: uniqueLabels) { 
     if ("".equals(l) || null == l) { 
      break; 
     } 
     for (String s: words) { 
      if (l.equals(s)) { 
       count++; 
      } 
     } 
     System.out.println("Word :: " + l + " Count :: " + count); 
     count = 0; 
    } 
} 

Und ich habe den folgenden Code einzigartigen lbels zu sammeln (Worte), wenn von link,

private static String[] getLabels(String[] keys) { 
     String[] uniqueKeys = new String[keys.length]; 

     uniqueKeys[0] = keys[0]; 
     int uniqueKeyIndex = 1; 
     boolean keyAlreadyExists = false; 

     for (int i = 1; i < keys.length; i++) { 
      for (int j = 0; j <= uniqueKeyIndex; j++) { 
       if (keys[i].equals(uniqueKeys[j])) { 
        keyAlreadyExists = true; 
       } 
      } 

      if (!keyAlreadyExists) { 
       uniqueKeys[uniqueKeyIndex] = keys[i]; 
       uniqueKeyIndex++; 
      } 
      keyAlreadyExists = false; 
     } 
     return uniqueKeys; 
    } 

Und das funktioniert gut, ich will 10 top sammeln Platz hängen Worte auf es Häufigkeit in der Datei.

+0

verwenden kann 'HashBag' in Sammlungen IO Apache. – ifly6

+0

Sollte wahrscheinlich auch auf 'List' und nicht auf' String [] 'wechseln. – ifly6

+0

Nein, das solltest du nicht, da das Schleifen in diesem Fall eine schlechte Idee ist. – Silverclaw

Antwort

0

Ich löste es wie

public class wordFreq { 
private static String[] w = null; 
private static int[] r = null; 
public static void main(String[] args){ 
    try { 
     System.out.println("Enter 'n' value :: "); 
     Scanner in = new Scanner(System.in); 
     int n = in.nextInt(); 
     w = new String[n]; 
     r = new int[n]; 
     FileReader fr = new FileReader("acq.txt"); 
     BufferedReader br = new BufferedReader(fr); 
     String text = ""; 
     String sz = null; 
     while((sz=br.readLine())!=null){ 
      text = text.concat(sz); 
     } 
     String[] words = text.split(" "); 
     String[] uniqueLabels; 
     int count = 0; 
     uniqueLabels = getUniqLabels(words); 
     for(int j=0; j<n; j++){ 
       r[j] = 0; 
      } 
     for(String l: uniqueLabels) 
     { 
      if("".equals(l) || null == l) 
      { 
       break; 
      }   
      for(String s : words) 
      { 
       if(l.equals(s)) 
       { 
        count++; 
       }    
      } 

      for(int i=0; i<n; i++){ 
       if(count>r[i]){ 
        r[i] = count; 
        w[i] = l; 
        break; 
       } 
      } 
      count=0; 
     } 
     display(n); 
    } catch (Exception e) { 
     System.err.println("ERR "+e.getMessage()); 
    } 
} 

public static void display(int n){ 
    for(int k=0; k<n; k++){ 
     System.out.println("Label :: "+w[k]+"\tCount :: "+r[k]); 
    } 
} 

private static String[] getUniqLabels(String[] keys) 
{ 
    String[] uniqueKeys = new String[keys.length]; 

    uniqueKeys[0] = keys[0]; 
    int uniqueKeyIndex = 1; 
    boolean keyAlreadyExists = false; 

    for(int i=1; i<keys.length ; i++) 
    { 
     for(int j=0; j<=uniqueKeyIndex; j++) 
     { 
      if(keys[i].equals(uniqueKeys[j])) 
      { 
       keyAlreadyExists = true; 
      } 
     }   

     if(!keyAlreadyExists) 
     { 
      uniqueKeys[uniqueKeyIndex] = keys[i]; 
      uniqueKeyIndex++;    
     } 
     keyAlreadyExists = false; 
    }  
    return uniqueKeys; 
} 

} 

und die Probe abgegeben wird,

Enter 'n' value :: 
5 
Label :: computer Count :: 30 
Label :: company Count :: 22 
Label :: express Count :: 20 
Label :: offer Count :: 16 
Label :: shearson Count :: 16 
3

Wenn Sie möchten, dass es mäßig schnell läuft, führen Sie nicht alle Strings in einem Array durch ... verwenden Sie eine HashMap ... oder finden Sie sogar eine Karte für Primitive.

Dann gehen Sie durch die Wörter. Wenn die Wörter in der Karte ist, erhöhen Sie den Wert, sonst setzen Sie eine 1. Am Ende, sortieren Sie die Karteneinträge und holen Sie die ersten 10.

Nicht ein Gesamt-Duplikat, aber diese Antwort zeigt ziemlich viel, wie zu bekommen die Zählung erfolgt: Calculating frequency of each word in a sentence in java

+0

Danke für Ihre Bearbeitung: D + rep –

+0

@Silverclaw, danke, sicherlich werde ich versuchen mit hashmap. und nehmen Sie eine Upvote :) –

2

Ich empfehle die Verwendung einer Hashmap<String, Integer>() um das Wort Frequenz zu zählen. Hash verwendet Schlüssel/Wert-Paare. Das bedeutet, der Schlüssel ist eindeutig (Ihr Wort) und die Wertvariable. Wenn Sie eine Put-Operation mit einem bereits vorhandenen Schlüssel ausführen, wird der Wert aktualisiert.

Hashmap

So etwas sollte funktionieren:

hashmap.put(key, hashmap.get(key) + 1); 

Um die oben dann Worte zu bekommen, würde ich irgendwie die hashmap implementieren und die ersten zehn Einträge abrufen.

+0

Err ... Ich hatte gerade einen anderen Gedanken. Da Integer ein Referenztyp ist, wenn der Schlüssel nicht existiert, haben Sie null + 1. – Silverclaw

+0

Okay, aber das kann leicht mit einem try catch block gelöst werden ... –

+0

@TobiasFriedinger, danke ich werde es versuchen ..:) –

Verwandte Themen