Welche Datenstruktur?

Hallo zusammen,

ich habe eine csv-Datei, die ca. 800 Datensätze enthält.
Der Aufbau ist eigentlich ganz simpel: Postleitzahl;Straße;Stadt;Ortsteil

Jetzt würde ich gerne ein kleines Tool schreiben, bei dem ich den Straßennamen eingeben kann und dann alle Straßen mit diesem Namen gefunden werden.

Mein Problem besteht jetzt darin, dass nicht weiß, wie ich die Datensätze in eine vernünftig Datenstruktur überführen soll.
Auf der Datei selber möchte ich nicht so gerne arbeiten, damit das Teil flexibel bleibt und man vielleicht auch mal mehr Datensätze verarbeiten kann.

Wie würdet Ihr das lösen? Vielleicht sogar mit einer Datenbank im Hintergrund?

Viele Grüße
 
S

Sym

Gast
Ich würde dafür eine In-Memory-DB verwenden. Der Vorteil ist, dass Du damit z.B. auch schnell Wildcard-Suchen unterstützt.

Mach Die da eine Tabelle rein und gut ists. Dann einfach direkt gegen die DB entwickeln.
 
Hallo zusammen,

erst einmal vielen Dank für das Feedback.

Ich würde dafür eine In-Memory-DB verwenden. Der Vorteil ist, dass Du damit z.B. auch schnell Wildcard-Suchen unterstützt.

Mach Die da eine Tabelle rein und gut ists. Dann einfach direkt gegen die DB entwickeln.

Wenn ich das richtig verstanden habe, dann sind die Daten aber nicht persistent und müsste die Datei bei jedem Programmstart einlesen.
Für 800 Datensätze sicherlich kein Problem, aber bei mehreren Tausend oder noch mehr weiß ich nicht, ob dass wirklich sinnvoll ist.

Klingt für mich so, als ob da eine Abstraktion (Klasse) "Addresse" angebracht wäre.

Das war auch meine erste Idee.
Die habe ich aber wieder verworfen, da ich so doch für jeden Eintrag in der Datei ein Objekt erzeugen würde. Das scheint mir auch sehr ineffizient zu sein.

Vielleicht lohnt sich auch eine Bibliothek, kurzes googeln hat Java CSV Library | Free Development software downloads at SourceForge.net zu Tage gefördert. Auch wenn CSV auf den ersten Blick einfach erscheint, gibt es doch eins, zwei Stolperfallen (escapen, quoten...)

Vielleicht verstehe ich das jetzt auch falsch, aber die Frage war eigentlich nicht, wie ich die Datei einlesen soll, sondern eher wie ich das eingelesene abspeichern soll, damit ich damit vernünftig arbeiten kann.

Viele Grüße
 

Landei

Top Contributor
Vielleicht verstehe ich das jetzt auch falsch, aber die Frage war eigentlich nicht, wie ich die Datei einlesen soll, sondern eher wie ich das eingelesene abspeichern soll, damit ich damit vernünftig arbeiten kann.

Ich würde dir trotzdem zu einer Bibliothek raten, jedenfalls wenn du die Datei nicht selbst erzeugst.

Ansonsten stimme ich mit maki überein, und würde eine entsprechende Klasse benutzen.

Vielleicht gibt es ja sowas ähnliches wie JAXB auch für CVS (oder du kannst statt CSV XML verwenden), dann gibt's die "Übersetzung" sogar gratis.
 
Mir ist da gerade noch etwas anderes eingefallen.

Was würdet Ihr von einem Baum halten?
Als Ebenen von Oben nach unten stelle ich mir Ort, Ortsteil, PLZ und Straße vor.
Allerdings müsste ich dann immer bis zur Ebene Straße runter und da suchen. Bei großen Datenmengen scheint mir das auch nicht optimal zu sein.

Im Prinzip ist es ja wie bei einem Telefonbuch.
Was würde man denn hier für eine Datenstruktur nutzen?
 
Ich würde dir trotzdem zu einer Bibliothek raten, jedenfalls wenn du die Datei nicht selbst erzeugst.

Ansonsten stimme ich mit maki überein, und würde eine entsprechende Klasse benutzen.

Vielleicht gibt es ja sowas ähnliches wie JAXB auch für CVS (oder du kannst statt CSV XML verwenden), dann gibt's die "Übersetzung" sogar gratis.

Also seht ihr da keine Probleme, was die Anzahl der Objekte angeht?
 

andreT

Aktives Mitglied
Ist das nur eine Spielwiese, oder hat das Programm langfristigen produktiven Character z.B. für eine Firma o.ä.?
Wenn es eine Spielwiese ist würde ich das ganze von CSV nach XML portieren und dann z.B. diese API hier benutzen : XStream - Two Minute Tutorial
Die finde ich ganz schick und passt ja auch zu deinen Anwendungsfällen.
Wenn das ganze professionell sein soll, solltest du m.E. immer eine Datenbank benutzen. Für den Einstieg bzw. solltest du dich damit noch nicht auskennen, empfehle ich z.B. die Installation von xampp : apache friends - xampp
Installation der DB ist da inclusive und das Ganze ist sehr einsteigerfreundlich. Dann hast du eine MySQL Datenbank in die du die Daten problemlos aus der CSV Datei direkt importieren kannst. Der Zugriff auf die Daten bzw. Lesen/Schreiben ist kinderleicht und weil der MySQl Zugriff auch via Java so verbreitet ist gibts dazu im Netz viele gute Tutorials!
 
Hiermit kannst du auch direkt SQL-Querys auf deine csv-Datei schmeißen ;)
CsvJdbc Home

Sieht interessant aus.

Ist das nur eine Spielwiese, oder hat das Programm langfristigen produktiven Character z.B. für eine Firma o.ä.?

Kurz zu meiner Motivation.
Es handelt sich dabei nicht um ein langfristiges Projekt was professionell eingesetzt wird. Ist also eher eine Spielwiese. Trotzdem möchte ich den Entwurf einigermaßen flexibel halten, damit man ich Projekt vielleicht später einmal wieder rauskramen und erweitern kann, um sich dann vielleicht in eine neue Technologie o.ä. einzuarbeiten.
Ich möchte jetzt bei diesem Projekt etwas mit Git, Maven, JUnit und log4j experimentieren.
 

Mujahiddin

Top Contributor
Also wenn du nur Adressen hast, und diese mit gar nichts anderem im Zusammenhang stehen, fände ich eine Datenbank zu viel. (eventuell embedded db)
Wenn die Menge der Adressen klein ist, dann würde ich 4 Listen empfehlen, die bei Programmstart einmalig eingelesen werden. Also "List<String> PLZ;" oder noch besser eine Klasse Address mit den 4 Attributen und eine
Code:
List<Address>
...
Falls du enorm viele Daten hast, würde ich einen Scanner empfehlen, der als Delimiter ";" entgegennimmt. Du würdest dann alle Informationen zu einer Adresse zwischenspeichern und die übergebene Straße auf Gleichheit überprüfen.

Java:
private static final String searchAddressIn(File file, String street) throws FileNotFoundException {
	String plz = "";
	String str = "";
	String town = "";
	String borough = "";
	try( Scanner sc = new Scanner( new FileInputStream(file) ) ) {
		sc.useDelimiter( ";" );
		boolean match = false;
		while( !match ) {
			plz = sc.next();
			str = sc.next();
			town = sc.next();
			borough = sc.next();
			match = str.equals/*IgnoreCase*/( street );
		}
	} catch(NoSuchElementException e) { /* Scanner reached end */
		return null;
	}
	return plz + ";" + str + ";" + town + ";" + borough;
}
 
Zuletzt bearbeitet:

andreT

Aktives Mitglied
Nö, nicht im geringsten.
Ansonsten ist es vollkommen normal in OOP Sprachen mit Objekten zu arbeiten, ist sozusagen der Normalfall ;)
Das sehe ich auch so. Wenn die Daten mehr oder weniger bzw. ohnehin nur als Datenpool dienen um irgendwann mal weitere Technologien auszutesten, würde ich sogar einfach die Objekte serialisiert (vllt. in einer Liste oder einzeln) in eine datei speichern. Ich habe aktuell auch solch einen Datenpool indem ich aktuell ca. 2500 ähnliche Objekte + 2500 Objekte mit jeweils ~300(!) String Variablen halte. Alles kein Problem, weder beim Einlesen noch beim Schreiben o.ä.. Ich hatte da auch erst Bedenken, bin jetzt aber froh von Anfangs CSV auf das serialisierte Speichern gewechslt zu haben. CSV bzw. die APIs dazu waren mir dann doch irgendwie zu ... stolperfallenmäßig (encoding, quoten, s.o.!).
 

ARadauer

Top Contributor
Datenstruktur für 800 Datensätze? Liste ;-)
Bei 800.000 kannst du dir über irgendwelche Baumstrukturen für performates Suchen gedanken machen...
 

Mujahiddin

Top Contributor
Datenstruktur für 800 Datensätze? Liste ;-)
Bei 800.000 kannst du dir über irgendwelche Baumstrukturen für performates Suchen gedanken machen...

Ich denke das Problem liegt z.T. darin, dass es sich um mehrere MB große Daten handeln soll. Naja heutzutage gibt's viel RAM also kann man notfalls auch mal 50MB in den Speicher laden (ob das so ne gute Idee ist...) aber ansonsten würde ich die Scanner-Methode empfehlen.

Wo mir was dazu einfällt: Gibt es ne besondere Struktur bei CSV, die den Anfang eines neuen Datensatzes signalisiert? Also z.B. zwei Semikolon. Dann könnte man die Datensätze intern einmal sortieren (natürlich auch abhängig davon, wie oft eine Straße abgefragt wird) und ein RAF verwenden, welches binär sucht.
 
Zuletzt bearbeitet:
H

hüteüberhüte

Gast
Ich würde auch Objekte erstellen und diese serialisieren. Als Datenstruktur würde ich eine Liste wählen. Zum Suchen würde ich die Liste durchgehen. Wenn die Suche nach einem Attribut zu langsam ist, würde ich dafür eine HashMap erstellen.

Btw: Sind die Datensätze geheim oder kannst du uns als Beispiel ein paar nennen, damit wir damit testen können?
 
Zuletzt bearbeitet von einem Moderator:
V

vanny

Gast
So lange deine Datensätze nicht mehr beinhalten als Postleitzahl;Straße;Stadt;Ortsteil,
und du unter 1Mio Einträge bleibst, kann man das Einlesen der kompletten CSV wohl verkraften.
Natürlich wäre es eleganter eine richtige DB zu verwenden. Dort sehe ich aber das Problem, dass du redundante imports aus deiner csv nur sehr schwer verhindern kannst, es sei denn jeder Eintrag kommt nur einmal vor oder die vorgehaltene CSV ist demensprechend frei von alten Datensätzen. Ist aber nur geraten, da ich nicht wirklich weiss, welchen Werdegang deine Daten so durchlaufen.

Zum Datentyp:
Schreib dir einen DatenTyp Adresse und leg diesen in eine List<Adresse>.

Gruß Vanny
 
Hallo zusammen,

nachdem nun einige von Euch geschrieben haben, dass ich einen Datentypen Adresse bauen soll und ihn in einer einfachen Liste speichern soll, bin ich zu der Überzeugung gekommen, dass dies der "richtige" Weg ist.
Dies war ja auch eine meiner ersten Überlegungen.

Möchte mich noch einmal bei allen für Ihre Tipps und Kommentare bedanken.

Viele Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu datenstruktur welche sich "im kreis" dreht Allgemeine Java-Themen 26
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
F welche Datenstruktur? Allgemeine Java-Themen 9
F Welche Datenstruktur Allgemeine Java-Themen 2
Z Welche Datenstruktur verwende ich h_ier bloss ? Allgemeine Java-Themen 14
S Welche Datenstruktur passt bei mir? Allgemeine Java-Themen 6
D Welche Datenstruktur? Allgemeine Java-Themen 2
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
P Feststellen, Welche Classes ich aus einem JAR nutze? Allgemeine Java-Themen 6
H Apache fop -- welche Möglichkeit gibt es um den Fortschritt anzuzeigen (Progressbar) Allgemeine Java-Themen 5
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
F Java Web App - welche Technologien? Allgemeine Java-Themen 11
S Welche API? Allgemeine Java-Themen 6
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
K Welche Zertifizierung passt? Allgemeine Java-Themen 10
A Variable, welche Exeption wirft als "Global" deklarieren Allgemeine Java-Themen 13
J Videokonferenz mittel Java ? Welche Möglichkeiten habe ich ? Allgemeine Java-Themen 2
J Welche Layouts benutzt ihr? Allgemeine Java-Themen 2
G Wiedereinstieg, welche Java Version empfehlt ihr Allgemeine Java-Themen 7
M Welche Exceptionbehandlung ist sinnvoll? Allgemeine Java-Themen 3
H NetBeans geotools 15 oder 16 - welche Abhängingkeiten gibt es? Welche Jars brauche ich? Allgemeine Java-Themen 4
S Welche Java Techologien gibt es fürs Frontend Allgemeine Java-Themen 4
S Welche Nutzen bringen Lamda Expressions? Allgemeine Java-Themen 1
M Welche Umgebung und Frameworks für mich als Umsteiger Allgemeine Java-Themen 6
C Welche Styleconvention Allgemeine Java-Themen 0
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
F Welche Systeme für hoch skalierbare Webanwendung? Allgemeine Java-Themen 7
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
P Check, welche Java Version installiert bevor ein Programm ausgeführt wird. Allgemeine Java-Themen 12
I Webseite auslesen (welche mittels Javascript Inhalt einbindet) Allgemeine Java-Themen 4
R Welche waren eure ersten Projekte? Allgemeine Java-Themen 10
G Wie kann man sehen, welche Applikationen mit java arbeiten? Allgemeine Java-Themen 17
L Social Media Webportal -> Welche Technologie (JEE, GWT) Allgemeine Java-Themen 8
J Welche Informationen werden beim Kompilieren gespeichert? Allgemeine Java-Themen 3
I Swing Welche Swing Komponente soll ich nehmen? Allgemeine Java-Themen 2
vladimir Welche API für Grafik und Drag&Drop Allgemeine Java-Themen 3
schlingel Plugin-Architektur - Welche nehmen? Allgemeine Java-Themen 6
U Welche 2D-API? Allgemeine Java-Themen 4
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
M Welche Dateiformate kann Java einlesen?? Allgemeine Java-Themen 26
E Neues Projekt - Welche GUI / IDE /Techniken / etc. Allgemeine Java-Themen 14
E Welche Icons für sichtbar /unsichtbar Allgemeine Java-Themen 2
J Welche Lösung für Servlets und JSPs in Eclipse? Allgemeine Java-Themen 5
N Für welche Art von Berechnungen macht JCUDA Sinn? Allgemeine Java-Themen 12
A Welche Exception verwenden? Allgemeine Java-Themen 2
T Welche Art von Hilfe?? Allgemeine Java-Themen 5
N welche run.bat? Allgemeine Java-Themen 3
R Assoziativer Speicher welche Unterschiede? Allgemeine Java-Themen 5
Developer_X Welche Dateien kann Java laden? Allgemeine Java-Themen 9
G Welche Schreibeweise ist richtig Allgemeine Java-Themen 16
ARadauer welche java version wird benutzt Allgemeine Java-Themen 4
E Welche Java-Version kennt isEmpty() ? Allgemeine Java-Themen 2
F Welche dicken Java-Bücher kennt ihr? Allgemeine Java-Themen 31
M Prüfen, welche anderen Programme laufen Allgemeine Java-Themen 5
K [erledigt] JVM welche läuft Allgemeine Java-Themen 9
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
E welche standalone Version von Tomcat benutzen? Allgemeine Java-Themen 6
S Welche Speicherung von Daten bei Kalendarfunktion der jtable Allgemeine Java-Themen 7
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
P welche jar enthält was? Allgemeine Java-Themen 5
V Welche Oberfläche empfehlt ihr mir? Allgemeine Java-Themen 19
S Welche jar's werden wirklich benötigt?` Allgemeine Java-Themen 5
G Dateien löschen welche vor heute erstellt wurden? Allgemeine Java-Themen 7
G Prüfen welche JRE-Version gebraucht wird Allgemeine Java-Themen 19
I Welche Möglichkeiten bietet Java um Records in Dateien zu sp Allgemeine Java-Themen 10
B Drucken - welche Bibliothek favorisiert Ihr? Allgemeine Java-Themen 16
J Welche Daten für Ative-X Funktion? Allgemeine Java-Themen 5
P welche java version für javax.mail? Allgemeine Java-Themen 7
B Erkennen welche Objekte den Heap verbrauchen? Allgemeine Java-Themen 2
B Welche Java-Version? Allgemeine Java-Themen 7
S Welche Javaversion ist in meinem Linux? Allgemeine Java-Themen 2
M 2 Javaversionen welche aktiv? Allgemeine Java-Themen 3
C Datumsfelder auslesen - egal welche Zeitzone Allgemeine Java-Themen 2
F SuppressWarnings("xxx") - welche Möglichkeiten gib Allgemeine Java-Themen 4
R Welche Exception bei write() nehmen Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
B Grafische Oberfläche - Welche Komponenten? Allgemeine Java-Themen 5
T JMF, welche Codecs gibts, und vor allem, wo? Allgemeine Java-Themen 9
H Welche Scriptsprache verwendet ihr in Java Allgemeine Java-Themen 9
G Welche Referenzsoftware ist in Java geschrieben? Allgemeine Java-Themen 8
P Welche Collection verwenden? Allgemeine Java-Themen 4
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
Kirby.exe Union Find Datenstruktur Allgemeine Java-Themen 27
U Klassen Komplexe Datenstruktur in Java Allgemeine Java-Themen 4
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
B Suche geeignete Datenstruktur Allgemeine Java-Themen 5
P Große Datenstruktur im Speicher halten Allgemeine Java-Themen 13
B Suche passende Datenstruktur für 2 Einträge Allgemeine Java-Themen 19
R Collections Datenstruktur gesucht Allgemeine Java-Themen 12
D Datenstruktur für Hierarchie/Baum mit Tiefe 3 Allgemeine Java-Themen 8
D Datenstruktur .. BlockingQueue (LIFO) Allgemeine Java-Themen 3
P Suche Datenstruktur Allgemeine Java-Themen 2
ruutaiokwu schnelle datenstruktur... Allgemeine Java-Themen 13
S Baumstruktur/Datenstruktur in Datei speichern Allgemeine Java-Themen 23
D Datenstruktur Allgemeine Java-Themen 2
B Datenstruktur: Liste Allgemeine Java-Themen 5
A Thread sichere Datenstruktur Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben