2016-11-20 1 views
1

Ich habe Strings aus einer Datei in eine ArrayList gespeichert und ein HashSet verwendet, um die Anzahl der Vorkommen jeder Zeichenfolge zu zählen.Sortieren von String-Vorkommen aus Textdatei

Ich freue mich, die Top 5 Wörter und ihre Anzahl der Vorkommen aufzulisten. Ich sollte dies ohne Implementierung einer Hashtable, Treemap, etc. erreichen können. Wie kann ich das erreichen?

ist hier meine Arraylist:

List<String> word_list = new ArrayList<String>(); 

     while (INPUT_TEXT1.hasNext()) { 
      String input_word = INPUT_TEXT1.next(); 
      word_list.add(input_word); 

     } 

     INPUT_TEXT1.close(); 

     int word_list_length = word_list.size(); 



     System.out.println("There are " + word_list_length + " words in the .txt file"); 
     System.out.println("\n\n"); 

     System.out.println("word_list's elements are: "); 



     for (int i = 0; i<word_list.size(); i++) { 
       System.out.print(word_list.get(i) + " "); 

      } 

     System.out.println("\n\n"); 

Hier ist mein HashSet:

Set<String> unique_word = new HashSet<String>(word_list); 

    int number_of_unique = unique_word.size(); 

    System.out.println("unique worlds are: "); 

    for (String e : unique_word) { 
     System.out.print(e + " "); 

    } 

    System.out.println("\n\n"); 


    String [] word = new String[number_of_unique]; 
    int [] freq = new int[number_of_unique]; 

    int count = 0; 

    System.out.println("Frequency counts : "); 

    for (String e : unique_word) { 
     word[count] = e; 
     freq[count] = Collections.frequency(word_list, e); 



     System.out.println(word[count] + " : "+ freq[count] + " time(s)"); 
     count++; 

    } 

Könnte es sein, dass ich einen Schritt am Grübeln? Vielen Dank im Voraus

+0

eine innere Klasse erstellen, sagen Z, zwei Felder mit - Wort, Zählung, die implementiert 'Vergleichbare ' und überschreibt die 'hashcode()' und 'equals() 'Methode. Erstellen Sie einen Satz von Instanzen dieser Klasse - wenn set das Objekt enthält, erhalten Sie es und inkrementieren Sie die Anzahl. Sortieren Sie es mit 'Collections.sort()'. Und da gehst du. – GurV

+0

Das gesagt, Hashmap ist wahrscheinlich der bessere Weg, es zu tun – GurV

+0

Es gibt eine einfache Implementierung in Apache Commons, mit 'HashBag' – ifly6

Antwort

1

Sie können dies HashMap mit tun (hält mit eindeutigen Wort als key und Frequenz als value) und sortieren dann die values in umgekehrter Reihenfolge, wie sie in den folgenden Schritten erläutert:

(1) Laden Sie das word_list mit den Worten

(2) die einzigartigen Wörter aus word_list Finden

(3) Speichern Sie die einzigartigen Wörter in HashMap mit einzigartigen Wort als key und frequenc y als value

(4), die mit dem Wert HashMap (Frequenz) Sortieren

Sie den Code unten beziehen:

public static void main(String[] args) { 

     List<String> word_list = new ArrayList<>(); 
     //Load your words to the word_list here 

     //Find the unique words now from list 
     String[] uniqueWords = word_list.stream().distinct(). 
             toArray(size -> new String[size]); 
     Map<String, Integer> wordsMap = new HashMap<>(); 
     int frequency = 0; 

     //Load the words to Map with each uniqueword as Key and frequency as Value 
     for (String uniqueWord : uniqueWords) { 
      frequency = Collections.frequency(word_list, uniqueWord); 
      System.out.println(uniqueWord+" occured "+frequency+" times"); 
      wordsMap.put(uniqueWord, frequency); 
     } 

     //Now, Sort the words with the reverse order of frequency(value of HashMap) 
     Stream<Entry<String, Integer>> topWords = wordsMap.entrySet().stream(). 
     sorted(Map.Entry.<String,Integer>comparingByValue().reversed()).limit(5); 

     //Now print the Top 5 words to console 
     System.out.println("Top 5 Words:::"); 
     topWords.forEach(System.out::println); 
} 
1

mit Java 8 und die gesamten Code in einem Block setzen.

Stream<Map.Entry<String,Long>> topWords = 
      words.stream() 
        .map(String::toLowerCase) 
        .collect(groupingBy(identity(), counting())) 
        .entrySet().stream() 
        .sorted(Map.Entry.<String, Long> comparingByValue(reverseOrder()) 
          .thenComparing(Map.Entry.comparingByKey())) 
        .limit(5); 

Iterate über Strom

topWords.forEach(m -> { 
      System.out.print(m.getKey() + " : "+ m.getValue() + "time(s)"); 
     }); 
Verwandte Themen