2016-08-11 2 views
0

Ich habe dieses Problem für ein paar Tage festgefahren. Ich möchte in der Lage sein zu überprüfen und zu zählen, wenn jedes Wort aus uniqueBagOfWords in einem Satz erscheint zum BeispielWie überprüft und zählt, wenn ein Wort in einem LinkedHashset in einem Satz von einer Arraylist erscheint?

UniqueBagOfWords = [i, wie, zu, spielen, Tennis, denken, Fußball, braucht, groß, Änderungen]

Ausgang würde

Satz bE- - Ich mag Tennis spielen = 1,1,1,1,0,0,0,0,0

Satz - Ich mag Fußball wie = 1,2, 0,0 0,0,1,0,0,0

public static void main(String[] args) { 
     List<String> sentences = new ArrayList<String>(); 
     sentences.add("i like to play tennis"); 
     sentences.add("i think football needs big changes"); 
     sentences.add("i like football like"); 

List<String[]> bagOfWords = new ArrayList<String[]>(); 
    for(String str : sentences){ 
     bagOfWords.add(str.split(" ")); 

    } 
    Set<String> uniqueBagOfWords = new LinkedHashSet<String>(); 
    for(String[] s : bagOfWords){ 
     for(String ss : s) 
      for(String st : ss.split(" ")) 
       if(!uniqueBagOfWords.contains(st)) 
        uniqueBagOfWords.add(st); 

    } 

Ich habe das versucht, ich weiß es ist nicht richtig, aber kann nicht herausfinden, wo ich von hier aus gehen soll. Jede Hilfe wäre großartig!

+0

Warum möchten Sie das Set trotzdem verwenden? Sie können es mit nur Arraylist tun. –

+0

Wie bekommt man '1,1,1,1,0,0,0,0,0' aus" Ich spiele gerne Tennis "? Sollte es nicht 5 geben, da "Tennis" in der Tasche ist? – Bohemian

+0

Sie haben einen Hash-Satz. Sie müssen es nicht durchlaufen. Verwenden Sie einfach 'contains()'. – EJP

Antwort

-1

Hier habe ich nur ein String-Array für die Tasche von Wörtern und ich habe alle Sätze in eine Arraylist. Dann habe ich einen Vergleich durchgeführt, um zu überprüfen, ob der Buchstabe an einer bestimmten Position im Satz mit der Position im Array bagOfWords übereinstimmt.

public static void main(String[] args) { 
    String[] bagOfWords = {"i", "like", "to", "play", "tennis", "think", "football", "needs", "big", "changes"}; 

    List<String> sentences = new ArrayList<String>(); 
    sentences.add("i like to play tennis"); 
    sentences.add("i think football needs big changes"); 
    sentences.add("i like football"); 

    for(String s1 : sentences){ 
     String[] sentenceSplit = splitWords(s1); 

     for(int i=0;i<sentenceSplit.length;i++){ 
      if(sentenceSplit[i].equals(bagOfWords[i])){ 
       System.out.print("1 "); 
      } 
      else{ 
       System.out.print("0 "); 
      } 
     } 
     System.out.println(""); 
    } 
} 

private static String[] splitWords(String sentence){ 
    String[] afterSplit = sentence.split(" "); 
    return afterSplit; 
} 
+0

Sie haben ein * O (N) * Problem in ein * O (N^2) * Problem verwandelt. Sie sollten den * Satz * durchlaufen, der 'Set.contains()' aufruft, was im Falle eines Hash-Satzes * O (1) * ist. – EJP

+0

Auch wenn Sie contains verwenden, müssen Sie überprüfen, ob das Wort in der richtigen Position ist oder nicht. Dafür denke ich, dass Sie den Satz in Wörter brechen müssen. Oder kannst du es einfach mit Sets machen? Ich bin verwirrt. –

-1

Versuchen Sie, Ihr HashSet zu durchlaufen, anstatt jedes Wort im Satz. Außerdem würde ich einen StringBuilder oder etwas Ähnliches für die Ausgabe verwenden. Werfen Sie einen Blick auf die Schleife unter:

for (String s : sentences) { 

     StringBuilder numberOfOccurences = new StringBuilder(); 

     for (String word : uniqueBagOfWords) { 
      if (s.contains(word)) { 
       numberOfOccurences.append("1,"); 
      } else { 
       numberOfOccurences.append("0,"); 
      } 
     } 

     System.out.println(s + " = " + numberOfOccurences); 
    } 

Ausgang:

Ich mag Tennis spielen = 1,1,1,1,1,0,0,0,0,0,

Ich denke, Fußball braucht große Veränderungen = 1,0,0,0,0,1,1,1,1,1,

Ich mag Fußball = 1,1,0,0,0,0,1, 0,0,0,

+0

Wie würde ich diesen Code aktualisieren, damit er zählt, wie oft ein Wort angezeigt wird? Wenn zum Beispiel Fußball in einem Satz zweimal auftauchte, würde er drucken 2. Danke! –

+0

Warum würden Sie den Code invertieren und einen Hash-Satz durchlaufen, wenn er eine * O (1) * 'contains()' Methode hat? – EJP

0

Ich denke, ein Array ist die falsche Datenstruktur. Eine bessere Wahl wäre einfach eine Karte der Grafen von jedem Wort, das in der Tasche, die ein Einzeiler ist:

Map<String, Integer> hits = Arrays.stream(sentence.split(" ")) 
    .filter(uniqueBagOfWords::contains) 
    .collect(groupingBy(identity()), counting()); 

Das ist etwas wie produzieren:

{i=1, like=2, football=1} 

, die eine scheint viel einfacher. Wenn Sie unbedingt ein (spärliches) Array benötigen, können Sie das als separaten Schritt erstellen.

Verwandte Themen