Werte aus DB in Liste speichern ohne mehrfach speicherung

Maxl

Mitglied
Hallo,

ich stehe wieder mal vor einem Problem... konnte bei der durchforstung des Forums nichts passendes findet, hoffe ihr könnt mir helfen !!

Ich würde gerne aus einer MySQL DB Werte auslesen und in einem Array oder LinkedList o.ä speichern, allerdings sind die werte mehrmals in der DB vorhanden, in meinem Array oder Liste soll der Wert aber nur 1 mal gespeicher werden !!
Wie kann ich die Abfrage handhaben, dass der Wert in der DB gelesen wird, dann überprüft wird ob er in der Liste schon verhanden ist und wenn er NICHT vorhanden ist, den Wert in die Liste schreibt !
Falls der Wert schon vorhanden ist soll das Programm zum nächsten Wert in der DB springen.

Ich lese via PreparedStatement aus der DB !

Vielen Dank und Gruß
Max
 

Gucky

Top Contributor
Ich sehe da nur den BruteForce Ansatz. Du vergleichst also alle neuen Elemente mit allen schon gespeicherten und wenn eins auftaucht, dass schon mal da war, springst du aus der Schleife raus, holst dir das neue Element und machst dann weiter.
 

stg

Top Contributor
Entweder du gehst einen Umweg über eine HashMap oder ähnliches, oder (was ich bevorzugen würde) du liest die doppelten Einträge gar nicht erst aus, wenn du sie nicht brauchst. :noe:
 

JavaGott

Gesperrter Benutzer
Mach doch ein DISTINCT in dein SQL Statement, dann bekommst auch nur einmal die Werte und nicht mehrfach.

Ansonsten bietet sich ggf. eine HashMap an. Da kannst du via contains einfach abfragen ob dieser Wert bereits vorhanden ist oder nicht.
 

stg

Top Contributor
Ich sehe da nur den BruteForce Ansatz. Du vergleichst also alle neuen Elemente mit allen schon gespeicherten und wenn eins auftaucht, dass schon mal da war, springst du aus der Schleife raus, holst dir das neue Element und machst dann weiter.

Bloß nicht! Das gibt ein katastrophales Laufzeitverhalten! Wenn man es wirklich selbst im Code machen möchte, dann sollte man sich wenigstens zuerst alle Einträge aus der DB holen, dann sortieren und schließlich nur noch einmal über die Liste laufen und dabei doppelte Streichen.
 

JavaGott

Gesperrter Benutzer
Muss man aber ja gar nicht. Einfach ohne zu überlegen reinschreiben..
:D

Naja, jenachdem welche Aktionen tatsächlich noch kommen sollen / müssen ist es ggf. schon interessant zu wissen ob es ein Duplikat ist oder nicht....

Ich weiß ja nicht was der Thread-Ersteller genau vor hat. Aber ja, grundlegend kann man da auch einfach nur reinschreiben.
 

Maxl

Mitglied
danke für die ganzen tipps...

der ansatz mit den doppelten einträgen gar nicht erst auslesen gefällt mir am besten!
Nur weiß ich nicht genau wie ich das umsetzen kann....
Der ablauf sieht dann so aus oder ?

Wert lesen -> überprüfen ob schon im Array/liste/o.ä vorhanden -> wenn ja überspringen -> wenn nein speichern -> nächster Wert/Zeile

Nur wie setze ich das im Code um ?!

Grüße
 

Maxl

Mitglied
Java:
PreparedStatement ps = connection 
                    .prepareStatement("SELECT sipaccount, zielnummer, datum, uhrzeit, dauer, endkundenVK FROM phonebills WHERE sipaccount =?"
            	    + "ORDER BY datum");
		    ps.setString(1, "4932222110xxx");
	        ResultSet result = ps.executeQuery();

	        while (result.next()) {
		      sipaccount = result.getString("sipaccount");
	          zielnummer = result.getString("zielnummer");
	          datum = result.getString("datum");
	          uhrzeit = result.getString("uhrzeit");
	          dauer = result.getString("dauer");
	          endkundenVK = result.getString("endkundenVK");

data = new String[]{
		        datumUhrzeit, zielnummer, dauerform, endkundenVK
	            };

Die Werte die doppelt vorkommen ist quasi der sipaccount (ps.setString(1, "4932222110xxx");, ich möchte aber bevor ich die einzeln daten für jeden sipaccount auslese erst eine list der einzelnen sipaccounts und dann für jeden sipaccount die daten auslesen !
Der sipaccount ist quasi mein identifier in der DB.
 
Zuletzt bearbeitet:

Maxl

Mitglied
Habe nun folgenden Code:

Java:
try{
				PreparedStatement prSt = connection
						.prepareStatement("SELECT DISTINCT sipaccount FROM phonebills");
				ResultSet result = prSt.executeQuery();
				
				while (result.next()){
					String sipacc = result.getString("sipaccount");
					
					sipData = new String[]{
							sipacc
					};
					sipListe.add(sipData);
			        sipaccountList = Arrays.asList(sipData);
				}
				prSt.close();
				result.close();
				
			}catch (SQLException e) {
				e.printStackTrace();
			}
			
            for (String[] item : sipListe){
            	for (int j = 0; j < item.length; j++) {
            		 sipaccount = item[j].toString();
          
            		 try {
            		        PreparedStatement ps = connection 
            	                    .prepareStatement("SELECT zielnummer, datum, uhrzeit, dauer, endkundenVK FROM phonebills WHERE sipaccount =?"
            	            	    + "ORDER BY datum");
            			    ps.setString(1, sipaccount);
            		        ResultSet result = ps.executeQuery();

            		        while (result.next()) {
            		          zielnummer = result.getString("zielnummer");
            		          datum = result.getString("datum");
            		          uhrzeit = result.getString("uhrzeit");
            		          dauer = result.getString("dauer");
            		          endkundenVK = result.getString("endkundenVK");
            		          
            		          	// Date format
            			          input = Integer.parseInt(dauer);
            			          final double scale3600 = 1.0/3600;
            			          final double scale60 = 1.0/60;
            			          int hh = (int) (input * scale3600);
            			          int mm = (int) (input * scale60);
            			          int ss = input - mm*60 - hh*3600;
            			          DecimalFormat format = new DecimalFormat("00");
            			          dauerform = (format.format(hh) + ":" + format.format(mm) + ":" + format.format(ss));
            			         
            			          DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
            			          DateFormat df2 = new SimpleDateFormat("dd.MM.yyyy");
            			          Date newDate;
            			          
            			          newDate = df.parse(datum);
            			          String datumFormat = df2.format(newDate);
            			          
            			      zielnummer = zielnummer.substring(0, zielnummer.length() -3) + "xxx";
            			      datumUhrzeit = datumFormat + ", " + uhrzeit;

            		          data = new String[]{
            			        datumUhrzeit, zielnummer, dauerform, endkundenVK
            		            };
            		          liste.add(data);
            		          list = Arrays.asList(data); 
            		        }
            		        result.close();
            		        ps.close();
            		        
            		      } catch (SQLException e) {
            		        e.printStackTrace();
            		      } 
            		 	PDFWriter pdfw = new PDFWriter();
         				pdfw.evnCreator(sipaccount, datum, liste, defaultListModel, jList);
            		    }
	
            		}
            	}
			connection.close();
		}

Allerdings stimmt irgendwas nicht ganz, und ich komm nicht darauf.
Irgendwie funktionieren folgenden Zeilen nicht (glaube ich):
Java:
PreparedStatement ps = connection 
            	                    .prepareStatement("SELECT zielnummer, datum, uhrzeit, dauer, endkundenVK FROM phonebills WHERE sipaccount =?"
            	            	    + "ORDER BY datum");
            			    ps.setString(1, sipaccount);

Denn bei meinem Ergebniss kommen nicht nur die werte von meinem sipaccount an sondern auch von den anderen ?! Funktioniert der String bei ps.setString(1, sipaccount) nicht ?!
 
Zuletzt bearbeitet:

Maxl

Mitglied
Also an dem Query liegt es wohl nicht... der wird richtig dargestellt !!

Liegt es an
Java:
for (String[] item : sipListe){
            	for (int j = 0; j < item.length; j++) {
            		 sipaccount = item[j].toString();

item ist ja der aktuelle sipaccount (z.b 498003309366) ist dann j < item.length überhaupt richtig ?!
 

dzim

Top Contributor
Aus der Hüfte geschossen würde ich wie einer der vorangegangen Poster auf eine SQL-Lösung hinaus gehen - alles andere ist aus Laufzeittechnischer Sicht eher Blödsinn!
Also entweder ein DISTINCT vor dem sipaccount, oder aber, da du hier mehrere Daten in der Ausgabe hast, eher ein GROUP BY - bitte mal danach googlen und deine Anfrage anpassen. Damit wäre der JAVA-seitige Blödsin irrelevant und deine DB (die im besten Fall hoch optimiert hinsichtlich der Indizes ist (z.B. sipaccount als Primary Key)) kann sich darum kümmern. SQL ist SEHR mächtig und wenn möglich sollte man so etwas halt immer der DB überlassen, als das was Clientseitig hineinzufrickeln.

EDIT: Könnte auch was mit HAVING sein, aber ich arbeite damit selbst nicht so oft und müsste es auch mal wieder üben...
 
Zuletzt bearbeitet:

Maxl

Mitglied
Was meinst du mit "Entweder einen DISTINCT vor sipaccount" ?!

Ich hole mir ja mit folgendem Code die einzelnen sipaccounts:
Java:
try{
				PreparedStatement prSt = connection
						.prepareStatement("SELECT DISTINCT sipaccount FROM phonebills");
				ResultSet result = prSt.executeQuery();
				
				while (result.next()){
					String sipacc = result.getString("sipaccount");
					
					sipData = new String[]{
							sipacc
					};
					sipListe.add(sipData);
			        sipaccountList = Arrays.asList(sipData);
				}
				prSt.close();
				result.close();

Nun stellt sich mir nur die frage, wie ich schritt für schritt die liste durch gehe... habe es mit folgendem ansatz versucht:
Java:
for (String[] item : sipListe){
            	for (int j = 0; j < item.length; j++) {
            		 sipaccount = item[j].toString();
          
            		 try {
            		        PreparedStatement ps = connection 
            	                    .prepareStatement("SELECT zielnummer, datum, uhrzeit, dauer, endkundenVK FROM phonebills WHERE sipaccount =?"
            	            	    + "ORDER BY datum");
            			    ps.setString(1, sipaccount);
            		        ResultSet result = ps.executeQuery();

Allerdings liest er auch die Zeilen aus der DB, die nichts mit dem aktuellen sipaccount zu tun haben ?!
Da komm ich nicht weiter, der ansatz passt doch soweit oder ?!

Danke für die Hilfe
Max
 

Maxl

Mitglied
Hat sich erledigt...

habe es nun wie oben gemacht, und lediglich vergessen vor jedem neuen sipaccount meine liste zu leeren in die ich die Daten schreibe -> zu kompliziert gedacht !

Vielen Dank für die ganzen hilfreichen Tipps aufjedenfall !!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C In DefaultTableModel nachträglich Werte einfügen Allgemeine Java-Themen 2
rosima26 Unterschiedliche Werte bei return/print Allgemeine Java-Themen 12
berserkerdq2 Kann man in IJVM maximal 3 Werte im Stack haben? Allgemeine Java-Themen 3
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
Arif Math.cos liefert komische Werte Allgemeine Java-Themen 8
X Größten Werte in meinem Array löschen? Allgemeine Java-Themen 16
D Erste Schritte Im Array Werte tauschen Allgemeine Java-Themen 5
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
Henrithebegiinerofjava Erste Schritte Werte in Eingabefelder einlesen und wiederholen lassen. Allgemeine Java-Themen 3
I Java: public final Werte: Gute oder schlechte Praxis? Allgemeine Java-Themen 6
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
J Swing UIManager Werte Allgemeine Java-Themen 6
4 Java 2 ArrayListen Werte herauslesen/übernehmen Allgemeine Java-Themen 4
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
KeVoZ_ int Werte in einen String fassen Allgemeine Java-Themen 4
N Werte aus Hashmap auslesen und übertragen Allgemeine Java-Themen 8
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
B Übergebene Werte in Gerätedatei schreiben Allgemeine Java-Themen 2
M Exceltabelle in Java erstellen und Werte einlesen Allgemeine Java-Themen 32
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
R Int werte vergleichen und Anzahl Paare ausgeben Allgemeine Java-Themen 4
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
R kann man irgendwie mit Arrays mit Eingabefenstern und Schleifen Werte abklappern? Allgemeine Java-Themen 2
L Windows CMD werte Parsen. Allgemeine Java-Themen 2
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
R Variablen per HSSF geheime Werte von JAVA an EXCEL Allgemeine Java-Themen 2
ARadauer Checksumme über BigDecimal Werte Allgemeine Java-Themen 11
C Datentypen Enum-Werte Bestanteil von anderem Enum Allgemeine Java-Themen 8
Q GregorianCalendar Methode add liefert komische Werte Allgemeine Java-Themen 3
BRoll Image RGB Werte auslesen und vergleichen Allgemeine Java-Themen 8
Madlip Variablen 3 Werte aus ArrayList und weiter ... Allgemeine Java-Themen 4
M Aus Excel Tabelle lesen und Werte in Array speichern Allgemeine Java-Themen 15
A String Array Werte in neues String Array übernehmen Allgemeine Java-Themen 5
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
R Zusammenhängende Werte in 2-dim. Array finden und zählen Allgemeine Java-Themen 3
S Sinnvolles skalieren von Werte-Set? Allgemeine Java-Themen 2
S Keytool: mögliche Werte für Parameter Allgemeine Java-Themen 4
P Werte in Array zählen und Summe der einzelnen Teile ausgeben Allgemeine Java-Themen 10
L Veränderbare Werte zusammenfassen Allgemeine Java-Themen 18
P Variablen Werte der Objektvariablen mit getFields() abfragen Allgemeine Java-Themen 2
O Variablen System.getenv: Sinnlose Werte, Arrays?! Allgemeine Java-Themen 6
J JSONObject Reihenfolge der Werte? Allgemeine Java-Themen 4
T java.uil.Random liefert negative Werte Allgemeine Java-Themen 2
c_sidi90 Werte an bestimmten Position aus PDF in DB sichern Allgemeine Java-Themen 2
C Vergleich von Enums gibt inkorrekte Werte Allgemeine Java-Themen 6
T Array Sortieren (null Werte ans Ende) Allgemeine Java-Themen 2
S Werte aus 2 eindimensionale boolean arrays mithilfe von logischen operatoren berechnen Allgemeine Java-Themen 6
C aus einem String einzelne Hex Werte lesen Allgemeine Java-Themen 7
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
M rxtx OutputStream sendet falsche werte Allgemeine Java-Themen 3
J Hex Werte in Bitmap Raster darstellen Allgemeine Java-Themen 16
E Werte übergabe Allgemeine Java-Themen 2
E Werte in andere Klasse übernehmen Allgemeine Java-Themen 8
S Bytes oder Hex-Werte zu Assembler Code? Allgemeine Java-Themen 6
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
P Methoden und Werte Allgemeine Java-Themen 17
M Kugelschnittberechnung liefert falsche Werte Allgemeine Java-Themen 4
N unzählige Werte am besten speichern(?) Allgemeine Java-Themen 2
D Spielerwechsel über boolsche Werte läuft inkorrekt Allgemeine Java-Themen 6
MonsterBit 2 Werte aus 2 Array vergleichen Allgemeine Java-Themen 10
T Apache POI Export EXCEL - [Zahlen-Werte] Allgemeine Java-Themen 1
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
Airwolf89 Zugriff auf Werte in ArrayList<ArrayList> Allgemeine Java-Themen 4
H Prüfen, ob doppete Werte in int-Array vorhanden sind Allgemeine Java-Themen 16
K Datenhaltungsklasse für wenige Werte? Allgemeine Java-Themen 4
T JProgressbar ändert werte nicht Allgemeine Java-Themen 28
K need help ; Werte aus einer Datei auslesen Allgemeine Java-Themen 4
C Eingegebene Werte werden nicht gezeichnet Allgemeine Java-Themen 2
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
hdi dynamische return-Werte Allgemeine Java-Themen 15
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
T Wurfweitenberechnung: X-Werte bei extremen Werten falsch. Allgemeine Java-Themen 15
G Excel Werte / Zellen formatieren Allgemeine Java-Themen 5
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
P Bedeutung der Process.exitValue() Werte? Allgemeine Java-Themen 3
C String to hex und hex-Werte löschen Allgemeine Java-Themen 2
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
M Werte im Browser aktualisieren Allgemeine Java-Themen 2
L Werte in externer Datei speichern und wieder auslesen? Allgemeine Java-Themen 8
MQue Werte in eine html- Datei schreiben Allgemeine Java-Themen 17
D werte in excelltabelle schreiben Allgemeine Java-Themen 5
N Werte Von C++ nach Java über den Stream möglich? Allgemeine Java-Themen 8
S JFreeChart LineChart Punkte über NULL Werte hinweg verbinden Allgemeine Java-Themen 5
G Werte zusammenfassen! Allgemeine Java-Themen 3
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
W PrintWriter (PrintStream) sendet falsche Werte Allgemeine Java-Themen 18
Y Methode soll 2 Werte zurückliefern Allgemeine Java-Themen 7
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
D Werte aus drei Auswahllisten Allgemeine Java-Themen 5
P JSlider nur bestimmte werte geben Allgemeine Java-Themen 2
P JavaCode verschlüsseln / verschlüsselte Werte Allgemeine Java-Themen 3
D JTextfield für double werte Allgemeine Java-Themen 2
D Spezielles Eingabefeld für Numerische Werte in Swing Allgemeine Java-Themen 2
D Werte aus mehreren getMethoden auslesen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben