Sortieralgorithmus für MySQL-Datenbanken.

skorpion130

Mitglied
Hallo zusammen,
vor mir liegt folgende Aufgabe. Ich soll aus einer Datenbank zwei Tabellen auslesen. Zu dem Zeitpunkt interessieren mich nur die Spalten mit den BenutzerIDs. Diese soll ich mit java auslesen, aufsteigend sortieren und ausgeben.
Die Verbindung zur Datenbank habe ich. Ich habe auch schon das Zusammenlegen der Einträgen in einem Array zusammengepackt. Das soriteren klappt aber nicht 100%, obwohl Arrays.sort() der richtige Befehl dazu sein sollte. Ich finde leider kein Fehler in der Code:
Java:
		// --- Daten auslesen
		try {
		ResultSet answerTable;
		ResultSet questionTable;
		String sQuestionid, sAskerid, sMember, sAnswererid;
		String[] member= new String[100]; //muss bei größeren Datensätzen angepasst werden
		
		//ResultSetMetaData answerTableMS;
		
		answerTable = orderA.executeQuery( "SELECT DISTINCT answererid FROM cen.answer ORDER BY answererid " );		
		questionTable = orderQ.executeQuery( "SELECT DISTINCT askerid FROM cen.question ORDER BY askerid" );
		
		int i = 0;
		int j = 0;
//nun werden die IDs aus einer Tabelle in ein Array gepackt
		while( answerTable.next() ) {
			i++;		
			member[j] = answerTable.getString( "answererid" );
			j++;
		//System.out.println(sId + ": " + "\t"  + sQuestionid + "\t" + sAnswererid);
		}
//nun aus der zweiter Tabelle in das selbe Array
		i = 0;
		while( questionTable.next() ) {
			i++;
			member[j] = questionTable.getString("askerid");
			j++;   
			}

		//nächster Schritt sollte doppelte Einträge eliminieren
		HashSet<String> strings = new HashSet<String>();
		for (int k = 0; member[k] != null; k++) {
		    strings.add(member[k]);
		}
		member = strings.toArray(new String[0]); //String wieder in Array umwandeln
		
		Arrays.sort(member);
		
		
		System.out.println("*Vertices");		
		for (int m=0;m < member.length; m++){
			System.out.println("KnotenID" + member[m]);
			}
		System.out.println("ENDE");
		verbindung.close();
		} catch( Exception e ) {
		e.printStackTrace();
		}
		// --- Daten auslesen

die Code gibt raus:
1
2
21
22
3
Wieso werden die Zahlen im Array erst nach dem ersten Zeichen sortiert? Ich habe mehrere hinweise gefunden, dass auch ein String[] damit problemlos sortiert werden kann. Ein Int[] kann ich leider nicht verwenden, da ich von Query ein String bekomme und kann nicht in int umwandeln.War meine Vorüberlegund überhaupt richtig, ein Array dazu zu verwenden oder gibt es eine elegantere Lösung?
P/S was mich bei der Lösung noch stört, dass ich dem Array schon am Anfang einen Wert zuweisen muss, wobei die Anzahl der Benutzer auch wachsen könnte. Nur weiß ich nicht, wie ich das anders lösen könnte.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Es sind ja auch Strings die du sortierst und Strings werden lexikographisch sortiert.
Du musst also Integer (o.ä.) verwenden.
Aber du bekommst ja schon die Werte von der Datenbank sortiert zurück, wozu also noch mal sortieren?
 

diel2001

Bekanntes Mitglied
Strings werden nachdem ihrem ASCII code sortiert und es fängt beim ersten Zeichen an
1
12
2
23

Wenn es nur Zahlen sind, kannst du es doch zu einem Integer machen und dann sortieren
 

skorpion130

Mitglied
danke erst mal für die Antworten nur die Vorschläge kann bei dem Beispiel leider nicht anwenden.
@XHelp
Das ein String so sortiert wird, ist mir nun klar. Ein Int-Array kann ich wegen dem String-Input nicht verwenden.
zur Sortierung:
ich bekomme sie zwar schon einzeln sortiert, nur es ist nicht ausgeschlossen, dass Benutzer gibt, die nur in einer der Tabelle vorkommen. Zum Beispiel, einer hat nur Fragen gestellt, aber noch nie eine selbst beantwortet. Aus meiner Aufgabenstellung habe ich keine dritte Tabelle mit Userdaten. Deswegen muss ich sie aus den beiden Tabellen auslesen und daher danach sortieren.
 

XHelp

Top Contributor
JOIN drumherumschrauben und dann mit einer Query auslesen.
Wenn das Strings sind, dann ist das die richtige Reihenfolge. Wenn du die wie Zahlen sortieren willst, dann dürfen keine Buchstaben auftauchen.
Notfalls musst du dir einen eigenen Comparator schreiben.
 

skorpion130

Mitglied
die Variante mit dem Join wäre hier sicherlich gute Lösung. Das hätte mir in Java eine Menge Arbeit gespart. Ich konnte bis jetzt keine Beispiele finden, wie ich nur mit einem Query aus zwei Tabellen zwei Spalten raus lesen, in eine Spalte zusammen fügen, Doppeleinträge eliminieren und dann sortieren kann. Könntest du mir da helfen?
ich suche in dieser Zeit nach "was ist Comparator" und weiteren Join-Abfragen :)

P/S Die BenutzerIDs können nur Zahlen sein, nur Java bekommt die Zahlen trotzdem als String
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Könntest du mir da helfen?
Beschreib mal wie die Tabellen aussehen, und was genau du da machen willst und welche Einträge du haben willst und welche nicht, dann lässt sich bestimmt irgendein Beispiel finden.
P/S Die BenutzerIDs können nur Zahlen sein, nur Java bekommt die Zahlen trotzdem als String

Dann könntest du ja einfach statt
Code:
getString
auch
Code:
getInt
aufrufen und schon bekommst du eine Zahl zurück.
 

skorpion130

Mitglied
Dann könntest du ja einfach statt
Code:
getString
auch
Code:
getInt
aufrufen und schon bekommst du eine Zahl zurück.

Stimmt, oh man, ich dachte, es geht nur mit string. Nun wird auch korrekt sortiert. Bleibt dann jetzt nur die doppelte Einträgen anders löschen, aber das packe ich schon selber.

Den Dank hast verdient :) Was mich aber trotzdem sehr interessiert, wie ich bei einer Datenbankabfrage das auf einmal abfragen könnte und mir das nächste mal die Arbeit sparen.

Also ich habe diese beide Tabelle, die ich schon zufällig befüllt habe. Ich will nun aus diesen beiden Tabelle alle Mitglieder rausfinden, die schon mal eine Frage oder Antwort gepostet haben. Danach sollen sie sortiert und höchstens einmal mit Java ausgegeben werden.
 

XHelp

Top Contributor
Du willst also alle answererid UND alle askerid, aber jeden eintrag höhstens 1 mal? Dann kannst du auch zunächst mit UNION deine beiden Abfragen verbinden und dann noch mal DISTINCT machen.
 

skorpion130

Mitglied
hat funktioniert ;)
[SQL=5](SELECT answererid FROM cen.answer) UNION (SELECT askerid FROM cen.question)ORDER BY answererid[/code]

schon ärgerlich, 10 Minuten und ein zufrieden stellender Ergebnis. Gestern wollte ich es noch mit eigenen Kräften lösen und für die andere Lösung über 5 Stunden gebraucht.

Danke euch nochmals. Das Thema lasse ich noch kurz offen, da ich noch ein zweites Teil der Aufgabe lösen muss. Das Probiere ich nun mit den SQL-Abfragen zu lösen.:rtfm:
 
Zuletzt bearbeitet:

Neue Themen


Oben