Wie kann eine HashMap nur aus einem Eintrag / Objekt bestehen?

8

Ich möchte ein HashMap mit nur einem Schlüssel-Wert-Objekt haben.

Ich habe das folgende HashMap erstellt:

%Vor%

In der HashMap möchte ich nur einen Eintrag / ein Objekt haben. Der Schlüsseltyp ist eine Ganzzahl. Der Werttyp ist ein String.

  

z.B. = & lt; 1, "foo.txt" & gt;

Jedes Mal, wenn ich ein bestimmtes Wort in einer Datei finde, möchte ich

  1. Erhöhen Sie den Zähler in der Taste

  2. Fügen Sie die neue Datei in den Wert

  3. ein

z.B. Nehmen wir an, ich suche in einer DocsCollection nach dem Wort "Hello", Ich muss für jeden Auftritt des Wortes "Hallo" den Begriff Häufigkeit speichern und die neue Datei mit dem vorherigen Wert verketten.

  

& lt; 3, "foo.txt, hello.txt, test.txt" & gt;

3 bedeutet, dass ich das Wort "Hallo" in drei Dateien gefunden habe.

und der Wert besteht aus den Dateien, in denen das Wort gefunden wurde

Wenn ich die Methode put verwende, wird ein neuer Eintrag in HashMap erstellt, da sich der Schlüssel ändert. Es ist nicht stabil. Es beginnt mit "1", aber wenn ich das Wort zum zweiten Mal finde, erhöht sich der Schlüssel und dann fügt die Put-Methode einen neuen Eintrag mit einem neuen Schlüssel ein Aber ich möchte nur einen Eintrag haben und den Schlüssel ändern. Kann das gemacht werden? Wie kann ich nur ein Objekt in einer HashMap haben und den Schlüssel jedes Mal ändern?

%Vor%

Danke, im Voraus

    
programmer 12.01.2012, 20:01
quelle

9 Antworten

6

Der Map-Ansatz ist möglicherweise nicht der beste. Das Problem ist, dass Sie Ihren Schlüsselwert ändern.

Beachten Sie, dass es vielleicht besser ist, ein List<String> zu haben, und fügen Sie jedes Mal, wenn Sie das Wort gefunden haben, die Datei der Liste hinzu. Sie können die Zählung leicht mit list.size()

erreichen     
hvgotcodes 12.01.2012, 20:03
quelle
16

Versuchen Sie es so:

%Vor%

Diese Karte kann nicht geändert werden, wenn Sie dies tun möchten, tun Sie dies einfach:

%Vor%     
Nikolay Nikiforchuk 05.08.2013 14:57
quelle
5

Ich werde versuchen, Ihnen eine etwas andere Lösung vorzuschlagen, was Ihrer Meinung nach Ihre Aufgabe ist:

  • Sie haben Wörter ( hello , etc)
  • Sie möchten zählen, wie viele Dateien in
  • gefunden wurden
  • Sie möchten die Dateien kennen

Sie können mit einem MultiMap (Guave) dafür:

  • map.put("hello", "file1.txt"); map.put("hello", "file2.txt");
  • map.keys().count("hello") - liefert Ihnen die Anzahl, wie oft jedes Wort gefunden wird
  • map.get("hello") gibt eine Collection<String> zurück, die alle Dateien für dieses Wort enthält

Und Sie können so viele Wörter auf dieser Karte haben, wie Sie möchten. Wenn Sie einen Eintrag pro Karte benötigen, benötigen Sie X-Maps für X-Wörter.

    
Bozho 12.01.2012 20:04
quelle
2

Gibt es einen Grund, warum Sie eine HashMap verwenden müssen? Sie könnten einfach einen int (für die Zählung) und einen String oder StringBuffer (für die Dateinamen) haben und diese aktualisieren.

Alternativ könnten Sie eine Liste haben, in die Sie den Dateinamen jedes Mal einfügen, wenn etwas gefunden wird. Um die Anzahl zu ermitteln, verwenden Sie List.size (). Aber ich sehe, dass @hvgotcodes mich schon mit dieser Idee auf den Schlag geschlagen hat.

    
user949300 12.01.2012 20:06
quelle
2

Sie benutzen nicht wirklich ein HashMap sozusagen: Ihr Zähler ist nicht wirklich ein Schlüssel.

Was Sie gemäß Ihrer Erklärung benötigen, ist ein Object , das das Ergebnis Ihrer Suche darstellt, wie zum Beispiel:

%Vor%     
Jean Logeart 12.01.2012 20:09
quelle
1

Um sicherzustellen, dass das, was Sie wollen, funktioniert:

  1. Deklarieren Sie den Wert als List<String> .
  2. Entfernen Sie das ursprüngliche Schlüssel / Wert-Paar und ersetzen Sie es jedes Mal durch den neuen Inhalt, wenn Sie ein Wort gefunden haben.

Etwas wie:

%Vor%     
Tudor 12.01.2012 20:10
quelle
1

Nicht der gute Weg zu gehen.

Versuchen Sie stattdessen ein Map<String, Set<String>> , wobei der Schlüssel das Schlüsselwort ist und der Wert die Menge der Dateien ist, in denen Sie das Schlüsselwort gefunden haben. Das Hinzufügen wird dann wie folgt aussehen:

%Vor%

Dann können Sie Informationen aus dieser Karte sammeln, wenn dies erforderlich ist. Insbesondere um die Anzahl der Dateien zu ermitteln, in denen ein Schlüsselwort gefunden wurde, würden Sie:

%Vor%     
fge 12.01.2012 20:13
quelle
1

Hier ist eine Idee für eine Map mit einem einzelnen Schlüssel / Wert: Erstellen Sie die Map, fügen Sie das einzelne Schlüssel / Wert-Paar hinzu und machen Sie es dann mit Collections.unmodifiableMap() . Auf diese Weise können der Karte keine weiteren Elemente hinzugefügt werden. So:

%Vor%

Dies funktioniert only , wenn Sie den Schlüssel / Wert vorher kennen; Nach dem Aufruf von unmodifiableMap wird die Karte effektiv eingefroren und Sie können keine weiteren Elemente hinzufügen / entfernen.

Nun, was Sie in der Frage fragen, ist nicht geeignet für die Verwendung einer Map, das ist nicht die richtige Datenstruktur für die Verwendung in diesem Fall. Es wäre besser, ein ArrayList<String> zu haben, die Dateinamen hinzuzufügen, in denen das Wort gefunden wurde, und die Methode size() der Liste zu verwenden, um die Anzahl der Dateien zu bestimmen, in denen das Wort gefunden wurde.

    
Óscar López 12.01.2012 20:05
quelle
1
%Vor%

Wenn Sie eine Datei finden (nennen wir sie hello.txt), und sagen wir, Sie sind in YourClass, wenn Sie sie finden, tun Sie:

%Vor%

Bitte beachten Sie, dass dies absolut retardiert ist. & lt;

gehe mit vakimshaars Lösung;)

    
davogotland 12.01.2012 20:20
quelle

Tags und Links