2016-04-23 12 views
2

Ich möchte eine .txt Datei lesen, alle Wörter innerhalb dieses Textes nehmen und irgendwie ausdrucken, wie oft jedes Wort im Text ist.Set <> innerhalb der Karte <>, alles drucken?

Nehmen wir zum Beispiel diesen Text:

"A bright day a man walked into a bar and asked for a beer. He was denied the beer because he was a sheep" 

Sollte dies geben:

5: a 
2: he, beer 
1: bright, day, walked, into, bar, asked, denied, was, the,because, man, and, for 

Hier ist mein Code:

private void computeFrequencyMap() throws IOException { 
    TreeMap<String, Integer> dMap = new TreeMap<String, Integer>(); 
    BufferedReader br = new BufferedReader(new FileReader(filen)); 
    String line; 
    while((line = br.readLine()) != null){ 
     String [] words = line.split("\\s+"); 
     for (String word : words) { 
      word = word.replaceAll("[^a-zA-Z]", ""); 
     if (!dMap.containsKey(word.toLowerCase())) { 
      dMap.put(word.toLowerCase(), 1); 
     } else { 
      int count = dMap.get(word.toLowerCase()); 
      dMap.put(word.toLowerCase(), count + 1); 
     } 
     } 
    } 
    TreeMap<Integer, HashSet<String>> sMap = new TreeMap<Integer, HashSet<String>>(); 
    for (Map.Entry<String, Integer> entry : dMap.entrySet()) { 
     if(sMap.containsKey(entry.getValue())){ 
      //sMap.put(entry.getValue(), entry.getKey()); 
     }else{ 
      sMap.put(entry.getValue(), new HashSet<String>()); 
     } 
    } 
    for (Entry<Integer, HashSet<String>> entry : sMap.entrySet()) { 
     System.out.println(entry.getKey() + " " + entry.getValue()); 
    } 
} 

Dies ist, was ich bekomme, wenn ich das laufen Code:

1 [] 
2 [] 
3 [] 
4 [] 
5 [] 
6 [] 
7 [] 
8 [] 
9 [] 
10 [] 
11 [] 
12 [] 
14 [] 
16 [] 
18 [] 
27 [] 
32 [] 
33 [] 
38 [] 
44 [] 
54 [] 
71 [] 

Ich bin nur so weit gekommen, kann nicht den "add to the set" Teil richtig bekommen, irgendwelche Vorschläge?

Antwort

1

Sie tatsächlich vergessen, um die Worte zu addieren, wenn Sie die Karte umgekehrt: Dies ist kein Java Antwort

Map<Integer, Set<String>> sMap = new TreeMap<>(); 
for (Map.Entry<String, Integer> entry : dMap.entrySet()) { 
    Integer appearances = entry.getValue(); 
    Set<String> words = sMap.get(appearances); 
    if (words == null) { 
     words = new HashSet<>(); 
     sMap.put(appearances, words); 
    } 
    words.add(entry.getKey()); 
} 
+0

dieser Code nicht kompiliert. Damit es funktioniert, Set words = sMap.get (Erscheinungen); sollte durch HashSet ersetzt werden words = sMap.get (Erscheinungen); – JavaHopper

+0

Danke für die Hilfe! –

+0

@JavaHopper Ich musste den Code mit Ihrem answe optimieren, funktioniert super! Danke –

1

Ihr Problem

private void computeFrequencyMap() throws IOException { 
     TreeMap<String, Integer> dMap = new TreeMap<String, Integer>(); 
     BufferedReader br = new BufferedReader(new FileReader("input.txt")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      String[] words = line.split("\\s+"); 
      for (String word : words) { 
       word = word.replaceAll("[^a-zA-Z]", ""); 
       if (!dMap.containsKey(word.toLowerCase())) { 
        dMap.put(word.toLowerCase(), 1); 
       } else { 
        int count = dMap.get(word.toLowerCase()); 
        dMap.put(word.toLowerCase(), count + 1); 
       } 
      } 
     } 
     System.out.println(dMap); 
     TreeMap<Integer, HashSet<String>> sMap = new TreeMap<Integer, HashSet<String>>(); 
     for (Map.Entry<String, Integer> entry : dMap.entrySet()) { 
      if (sMap.containsKey(entry.getValue())) { 
       ((Set<String>)sMap.get(entry.getValue())).add(entry.getKey()); 
      } else { 
       HashSet<String> set = new LinkedHashSet<String>(); 
       set.add(entry.getKey()); 
       sMap.put(entry.getValue(), set); 
      } 
     } 
     for (Entry<Integer, HashSet<String>> entry : sMap.entrySet()) { 
      System.out.println(entry.getKey() + " " + entry.getValue()); 
     } 
    } 
+0

Danke für die Hilfe!Ich musste es ein wenig muireniks beantworten mit Ihrer Antwort, und es funktioniert perfekt! –

+0

kein Problem. Verwenden Sie stattdessen LinkedHashSet, wenn Sie möchten, dass die Bestellung erhalten bleibt – JavaHopper

+0

Nochmals vielen Dank, schauen Sie sich das an! –

1

beheben sollte. Aber Ihre Frage ist ein perfektes Beispiel dafür, wie klassische Werkzeuge Unix-Shell verwenden (tr, sed, sort, uniq):

  • tr wandelt alle Großbuchstaben in Kleinbuchstaben
  • sed entfernt die Punkt .
  • sort Art das Wort alphabetisch
  • uniq zählt sie
  • sort Sorten die Grafen

Versuchen Sie folgendes:

$ tr '[:upper:]' '[:lower:]' < so.txt |\ 
    sed 's/\.//' |\ 
    tr " " "\n" |\ 
    sort |\ 
    uniq -c |\ 
    sort -r -n 

Ausgang:

 5 a 
     2 was 
     2 he 
     2 beer 
     1 walked 
     1 the 
     1 sheep 
     1 man 
     1 into 
     1 for 
     1 denied 
     1 day 
     1 bright 
     1 because 
     1 bar 
     1 asked 
     1 and 
+0

das ist so cool! – JavaHopper

+1

Vielen Dank für Ihre Antwort, definitiv lohnt sich das Lernen! –

1

Just for fun, hier ist, wie es in Java 8 getan werden könnte:

String content = "A bright day a man walked into a bar and asked for a beer. He was denied the beer because he was a sheep"; 
Map<Long, List<String>> mapByCount = Arrays.stream(content.split("(|\\.)+")) 
    .map(String::toLowerCase) 
    .collect(groupingBy(Function.identity(), counting())) 
    .entrySet() 
    .stream() 
    .collect(
     groupingBy(
      Map.Entry::getValue, 
      () -> new TreeMap<>(Collections.reverseOrder()), 
      mapping(Map.Entry::getKey, toList()) 
     ) 
    ); 

System.out.println(mapByCount); 

Ausgabe:

{ 
    5=[a], 
    2=[was, he, beer], 
    1=[for, bright, the, into, bar, walked, asked, and, because, man, denied, day, sheep] 
} 
+0

Vielen Dank dafür! Gerade angefangen, über Lambda-Ausdruck in der Schule zu lernen, sollte mehr in es schauen, sehr cool! –

+0

Wenn Sie es mögen, wählen Sie meinen Freund :-) –

+0

Jetzt kann ich upvote, wil tun! :) –

1
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 

public class Test { 
    private static final String REGEX = "(|\\.)+"; 

    public static Map<String, Integer> getWordCount(String txt) { 
     Map<String, Integer> map = new HashMap<>(); 

     for (String str : txt.split(REGEX)) { 
      str = str.toLowerCase(); 

      if (!map.containsKey(str)) { 
       map.put(str, 1); 
       continue; 
      } 

      int count = map.get(str); 
      map.put(str, count + 1); 
     } 
     return map; 
    } 

    public static Map<Integer, String> reverseMap(Map<String, Integer> wordCount) { 
     Map<Integer, String> map = new HashMap<>(); 

     Set<String> keys = wordCount.keySet(); 

     for (String key : keys) { 
      int val = wordCount.get(key); 
      if (!map.containsKey(val)) { 
       map.put(val, key); 
       continue; 
      } else { 
       String data = map.get(val) + "," + key; 
       map.put(val, data); 
      } 
     } 

     return map; 

    } 

    public static void main(String args[]) throws IOException { 
     String content = new String(Files.readAllBytes(Paths 
       .get("input.txt"))); 

     Map<String, Integer> wordCount = getWordCount(content); 
     Map<Integer, String> result = reverseMap(wordCount); 
     System.out.println(result); 

    } 
} 
Verwandte Themen