Textdatei einlesen und in HashMap speichern (duplikate entfernen)

killig

Mitglied
[CODE lang="java" title="hashMap"]package übungen;

import java.io-BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

public class hashMapTest {
public static void main(String[] args) throws IOException{
BufferedReader reader = null;
String zeile = null;

HashMap<String, String> map = new HashMap<String, String>();

try {
Object[] keyes = map.keySet().toArray();
reader = new BufferedReader(new FileReader("C:\\Dev\\städteInput.txt"));

while((zeile = reader.readLine()) != null){
for (int i = 0; i < keyes.length; i++){
map.get(zeile);
}
}
} catch (IOException e1){
System.err.println("Error :" + e1);
}
System.out.println(map)
}
}

}
}[/CODE]
Hey, ich bin derzeit dran, eine Textdatei in eine Hashmap zu speichern. In der Textdatei befinden sich allerdings Duplikate, welche wohl durch eine HashMap automatisch entfernt werden soll. Jedoch wird meine HashMap immer als leer ausgegeben. Dazu muss ich sagen, dass ich noch nie zuvor mit einer HashMap gearbeitet habe.
Mfg
 
Dir ist bekannt, was eine Map ist? Und was diese macht?

Du erstellst eine neue (leere) HashMap und holst Dir dann die Keys in ein Array? Was erwartest Du in diesem Array? Ok, nutzt Du nicht weite, also ok - Die Zeile kann also einfach weg.

Dann schau mal, was ein map.get macht.

Also zum einen speichert eine Map Key/Value Paare - die hast du aber nicht, daher ist die Map einfach ungeeignet.
Was Du brauchst ist also vermutlich ein Set. Und damit kannst Du Dich etwas beschäftigen.

Evtl. macht es Sinn, dass Du Dir generell erst mal einen Überblick über die verfügbaren Collection Klassen verschaffst: https://www.javatpoint.com/collections-in-java (Aber Google liefert zu "Java Collections" sehr viel mehr!)

Edit: Typos korrigiert
 
Zuletzt bearbeitet:
Warum eine HashMap, warum kein HashSet?

Damit erreichst du dein Ziel genauso, brauchst aber dieses Key-Value-Gerödel nicht. Einfach alle Strings in ein HashSet werfen, das HashSet kümmert sich darum daß da alles nur einmal vorkommt.
 
Hallo du willst aus einer Datei etwas in eine Map schreiben.
Mit get kannst du etwas aus der Map lesen aber nicht schreiben. Logisch das sie leer ist. Wurde ja auch nichts in ihr gespeichert.
Etwas in eine Map hinzufügen dann schaue dir mal "put(... , ...)" an.
 
Hallo du willst aus einer Datei etwas in eine Map schreiben.
Mit get kannst du etwas aus der Map lesen aber nicht schreiben. Logisch das sie leer ist. Wurde ja auch nichts in ihr gespeichert.
Etwas in eine Map hinzufügen dann schaue dir mal "put(... , ...)" an.
put(key, value) nutze ich ja schon. Das get mir was gibt, ist klar. 😀
Jedoch beinhaltet die textdatei pro Zeile nur ein Wort. In den ganzen Beispielen im Internet werden die immer über map.add("Key1", "Hier steht der erste Punkt"), etc. hinzugefügt. Also habe ich so gesehen nur die values. Über Set<String> keyes = map.keySet(); fügt er mir keine hinzu, da vekomme ich den Fehler
"The method put(Integer, String) in the type HashMap<Integer, String> is not applicatet for the arguments (Set<Integer>, String) "
 
Hast Du Dich einmal mit den Collections allgemein beschäftigt? Das wird alles sehr gut auf vielen seiten beschrieben und wenn da etwas verlinkt wurde, dann sollte es recht schnell klar werden.

Also habe ich so gesehen nur die values.
Nein, Du hast Key/Value Paare und nicht nur die Values. Das, was in einer Map gespeichert ist, kannst Du über entrySet() abrufen. Wenn Du dir das anschaust, dann wird dir hoffentlich deutlich, was Du in einre Map hast: Eine Menge (Set) von Key/Value Paaren (Map.Entry Klasse).

Und daher darfst Du bei Map.put auch nur den Key und den Wert angeben, denn dann wird ein Paar von dem Key und dem Wert gespeichert.
 
Wie schon gesagt wurde ist ein Hashset besser für dein vorhaben geeignet

PS
map.add("Key1")
Ist ein Set
Das sehe ich so nicht. Ich denke eher, dass er da derzeit die Reihenfolge der Reihe nach haben möchte, also sowas wie: erster Wert: xxx, zweiter Wert: yyyy, ....

Wenn die Reihenfolge der Werte wichtig ist und erhalten bleiben werden sollte, dann ist das kein Map<Integer, String> sondern einfach eine List<String>, die dann halt die Reihenfolge hat und der Zugriff über den Platz ist auch möglich und ist lediglich 0-basiert, d.h. der erste Wert ist an Position 0, der zweite Wert an Position 1 u.s.w.
 
Wenn das so ist. Dann sollte er den key selber generieren. Einen int in String als key zb. Das value ist das der Word aus der Datei

Um doppelte Einträge der Datei nicht mit zuspeichern dann vielleicht key das Word und value ist der generierte index.
 
Zuletzt bearbeitet:
Bei list sind doch doppelte Einträge oder? Bei einem Set nicht.
Die Anforderungn sind schlicht nicht bekannt. Wir wissen nicht, was er will, wir haben nur Code, aus dem zumindest ich nichts sinnvolles herauslesen kann.

Wenn mein Verdacht richtig ist und er in einer Map<Integer, String> in dem Key die Stelle, an der der Wert gekommen ist, speichern will, dann bedeutet es nur, dass du keine doppelten Stellen hast. Und das ist bei der List ebenso. An einem Index ist immer nur ein Wert. Es gibt keine id mehrfach in einer List. Die Keys in einer Map sind einzigartig, aber die Values in einer Map können auch mehrfach vorkommen.

Aber ob dies etwas ist, das er machen will oder nicht, wissen wir einfach nicht.

Ob eine List besser geeignet ist als eine Map, wissen wir auch nicht. Das wäre z.B. der Fall, wenn er Werte löschen können will. Eine List macht keinen Sinn, wenn Du am Ende nur werte für 3, 17, 21 und 1000000 haben willst. Bei einzelnen Werten könnte man überlegen, Lücken mit null zu speichern, aber das Beispiel zeigt: Ein Array (bei ArrayList) mit >1 Mio Einträgen nur um 4 Elemente zu speichern erscheint zumindest unsinnig.

Daher wie immer die Frage: Was sind die genauen Anforderungen? Was dann Sinn macht muss man schauen. Daher reite ich auch darauf herum, dass sich der TE doch bitte mit den Collections generell auseinander setzt. Google wird zu "Einführung java collections" doch bestimmt etwas finden, das dem TE einen ersten Überblick gibt.
 
der Textdatei befinden sich allerdings Duplikate, welche wohl durch eine HashMap automatisch entfernt werden soll.
Daraus lese ich das er keine Duplikate in der Liste/ Map haben will.

Wenn er den Index braucht an dem das Wort in der Datei das erste Mal auftaucht ist eine Map wohl besser die sich den Index merkt., als value
 
Daraus lese ich das er keine Duplikate in der Liste/ Map haben will.

Wenn er den Index braucht an dem das Wort in der Datei das erste Mal auftaucht ist eine Map wohl besser die sich den Index merkt., als value
Ja, das ist im Start Post eigentlich recht deutlich - ich hatte mich zu sehr auf sein letztes Posting bezogen und dabei das Ursprungspost aus den Augen verloren.

Wichtig wäre halt,die Anforderungen genau zu nennen, wass er braucht.... Wir haben auf jeden Fall viele Lösungen erarbeitet:
- Ganz wichtig ist der Hinweis auf Set, das die doppelten Werte heraus wirft. Wenn die Sortierung gleich bleiben soll, dann wäre SortedSet noch eine Idee.
- Deine Idee jetzt mit der Position ist auch gut, wenn die erste Position gebraucht würde.
 

Zurück
Oben