Viele Informationen aus zwei Collections vergleichen

Status
Nicht offen für weitere Antworten.

chriss_2oo4

Mitglied
Hi,

ich habe einen Vector Wörter und einen Vector Sätze. Nun möchte ich herausfinden welche zwei Wörter (Wortpaare) min. 3x zusammen in einem Satz auftreten.

Alle einzelnen Wörter stehen im Vector Wörterund alle Sätze stehen im Vector Sätze, die Relation zwischen beiden Vectoren steht im Vector WortInSatz

Also z. B.:

Sätze:
-----------------------------------------------------------------
0 | Die Ampel ist grün...
1 | Wenn die Ampel grün ist...
2 | Die Ampel kennt folgende Zustände: grün, orange...
...
------------------------------------------------------------------

Wörter:
-----------------------------------------------------------------
0 | Die
1 | Ampel
2 | ist
...
------------------------------------------------------------------

WortInSatz (Wort-Id | Satz-Id):
------------------------------------------------------------------
0 | 0
1 | 0
2 | 0
...
------------------------------------------------------------------

Als ergebnis möchte ich jetzt die Wörter "Die" und "Ampel".

Nun weiß ich nicht ganz wie ich das realisieren soll, ich müsste ja jedes Wort miteinander vergleichen und mir das Vorkommen in einem Satz merken, und wo soll ich mir die ganzen Informationen merken -> evtl Hash-Map mit Id als Key und Anzahl als Value?

Hat vielleicht jemand eine bessere Idee wie man soetwas lösen könnte?


Lg Chriss
 
Hm - ja, spontan würd' sich sagen, dass man nicht drumrumkommt, über alle Wörter und alle Sätze zu laufen
Code:
for (String wort : wörter)
{
    for (String satz : sätze)
    {
        if (satz.contains(wort))
        {
            erhöheZähler(wort);
        }
    }
}

Dann ginge es nurnoch um die Frage, wie man "erhöheZähler" implementiert. Das könnte dann aber davon abhängen, wie genau man die Information später auslesen will. Wenn man nur EIN mal Wörter rausfischen will, die eine Bestimmte Anzahl haben, tut's wohl eine HashMap, die man nachher einmal schnell durchsucht
Code:
private Map<String, Interger> wordCount = new HashMap<String, Integer>();

void erhöheZähler(String wort)
{
    if (!wordCount.containsKey(wort))
    {
        wordCount.put(wort, 1);
    }
    else
    {
        wordCount.put(wort, wordCount.get(wort)+1);
    }
}

// Auslesen: 
for (String wort : wordCount.keySet())
{
    if (wordCount.get(wort) == 3) System.out.println(wort);
}

Bei anderen Anwendungen (z.B. eine "Wortstatistik") könnte es aber geschicktere Lösungen geben, als eine HashMap. Für eine "Rangliste" der Wörter wäre eine Map, die nach Values sortiert vielleicht angebracht http://www.java-forum.org/de/topic67748_map-treemap-sorted-by-values.html , ... muss man sich halt überlegen.
 
Oha - ein Nachtrag: Je nachdem, um wie viele Worte uns Sätze es geht, könnte es sinnvoller sein, die Sätze zu zerlegen (man muss dann aber genau überlegen, wie man das macht - bzgl. Satzzeichen usw). D.h. man könnte das erste oben gepostete Codestück auch schreiben als
Code:
for (String satz : sätze)
{
    String wörterImSatz[] = ... zerlegen, z.b. mit String.split .... 
    for (String wort : wörterImSatz)
    {
        erhöheZähler(wort);
    }
}
und dann die damit erhaltene Map verwenden, um die gesuchten Wörter einzeln abzufragen. Die Laufzeiten hängen da dann auch wieder davon ab, welche Operation wie oft durchgeführt werden muss usw.... Wenn man SEHR viele Wörter abfragen muss, wäre die zweite Lösung sicher schneller.... Wenn man sehr viele Sätze mit sehr vielen Worten hat, aber nur wenige davon abfragen muss, wäre die erstgenannte evtl. sinnvoller, da sie dann viel weniger Speicherplatz braucht...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben