Java Wie funktioniert der Bubble Sort mit Strings?

Status
Für weitere Antworten geschlossen.

Rucki

Cadet 4th Year
Registriert
Apr. 2007
Beiträge
94
Hallo liebe Java Profis,

ich habe gerade ein Problem an dem ich gerade verzweifel:

Ich habe ein eindimensionales Array names artikelliste vom Typ Data. Es kann 100 Einträge speichern.
Die Klasse Data hat:

String Email
String Topic

Mit den jeweiligen Getter und Setter.

Nun muss ich mithilfe des BubbleSort die Artikel der Autoren nach der Email alphabetisch ordnen. Die Ausgabe ist quasi die alphabetisch geordnete Email Adresse des Autors und das Topic. Leider bekomme ich es nichtvernünftig zum laufen. :(

Als Beispiel sollen die Einträge so lauten
[0] Email: daniel@web.de
Topic: 1
[1] Email: andre@web.de
Topic: 2
[2] Email: andre@web.de
Topic: 3
[3] Email: fritz@web.de
Topic: 4
[4] Email: daniel@web.de
Topic: 5
[5] – [99] : null

Ich erhalte bei mir leider völligen Quatsch als Ergebnis. Hier mein vermurkster Code. Bin noch sehr blutiger Anfänger in Java:

Code:
public String[] sortArticleWithAuthor() {
       String temp;
       String[] ergebnis = new String[100];


   
       for(int x=0;x<SearchEngineSystemFrame.dbase.artikelliste.length-1;x++) {
            
            for(int y=0;y<SearchEngineSystemFrame.dbase.artikelliste.length-x;y++) {
                if (SearchEngineSystemFrame.dbase.artikelliste[y].getEmail()!= null && SearchEngineSystemFrame.dbase.artikelliste[y+1].getEmail()!= null){
                if(SearchEngineSystemFrame.dbase.artikelliste[y].getEmail().compareToIgnoreCase(SearchEngineSystemFrame.dbase.artikelliste[y+1].getEmail())>0)
				{
				temp=SearchEngineSystemFrame.dbase.artikelliste[y].getEmail();
                                temp=SearchEngineSystemFrame.dbase.artikelliste[y].getTopic();
				SearchEngineSystemFrame.dbase.artikelliste[y].setEmailTopic(SearchEngineSystemFrame.dbase.artikelliste[y+1].getEmail(),SearchEngineSystemFrame.dbase.artikelliste[y+1].getTopic() );
				SearchEngineSystemFrame.dbase.artikelliste[y+1].setEmail(temp);
                                SearchEngineSystemFrame.dbase.artikelliste[y+1].setTopic(temp);
                                ergebnis[y] = SearchEngineSystemFrame.dbase.artikelliste[y].getEmailTopic();
				}

                }
                }
            
            }
        
        
   return ergebnis;
    }

Danke euch!
 
Entwicklungsumgebung ist NetBeans.

Die erste Zeile soll so bleiben wie sie ist. Die ist vorgeben. Es muss also ein String[] zurückgegeben werden.

Ergebnis ist bei mir:

_11_33_44

Also ziemlicher Blödsinn. Wahrscheinlich genauso Blödsinn wie mein Code. Irgendwo muss ich einen gravierenden Fehler eingebaut haben.
 
was genau willst du jz sortieren?
die emailadressen aller leute im system oder die buchstaben einer email???
 
gut ein gravierender fehler ist schonmal das:

temp=SearchEngineSystemFrame.dbase.artikelliste[y].getEmail();
temp=SearchEngineSystemFrame.dbase.artikelliste[y].getTopic();

die email wird mal gleich verworfen...
jz postest du mir bitte noch die methoden getEmailTopic() und setEmailTopic()
 
Also getEmailTopic() liefert email+" "+topic?

Dein Hauptproblem ist wohl diese zeile:
temp=SearchEngineSystemFrame.dbase.artikelliste[y].getTopic();

Du überschreibst die in temp gespeicherte email adresse mit dem topic.
Du solltest temp lieber als Artikel Objekt definieren und die objekte vertauschen anstatt die werte der Attribute.
 
ZeRo. schrieb:
Also getEmailTopic() liefert email+" "+topic?

Dein Hauptproblem ist wohl diese zeile:
temp=SearchEngineSystemFrame.dbase.artikelliste[y].getTopic();

Du überschreibst die in temp gespeicherte email adresse mit dem topic.
Du solltest temp lieber als Artikel Objekt definieren und die objekte vertauschen anstatt die werte der Attribute.

also ich nehm mal an dass die das so machen und er das beim setten auch schön macht...
er kann es schon auch mit werte tauschen machen...is zwar nicht elegant aber soll er doch
dann braucht er aber auf jeden fall 2 temps dann funzt es auch
 
Zur besseren lesbarkeit kann ich noch sagen, dass du am besten vorher die artikelliste einer lokalen variable zuweist und die dann im weiteren methodenverlauf nutzt.
Also am Anfang der Methode sowas wie:

Data[] liste = SearchEngineSystemFrame.dbase.artikelliste;

und dann liste weiter benutzten anstatt immer diese gedöns von "SearchEngineSystemFrame.dbase.artikelliste"
 
Genau getEmailTopic() liefert email+" "+topic .

Ich werds mal mit euren Vorschlägen versuchen und meld mich nochmal obs klappt!

Vielen Dank schon mal!
Ergänzung ()

So ich habs erst mal mit zwei temp Variablen versucht:

Code:
public String[] sortArticleWithAuthor() {
       Data[] liste = SearchEngineSystemFrame.dbase.artikelliste;
       String temp;
       String temp2;
       String[] ergebnis = new String[100];


   
       for(int x=0;x<liste.length-1;x++) {
            
            for(int y=0;y<liste.length-x;y++) {
                if (liste[y].getEmail()!= null && liste[y+1].getEmail()!= null){
                if(liste[y].getEmail().compareToIgnoreCase(liste[y+1].getEmail())>0)
				{
				temp=liste[y].getEmail();
                                temp2=liste[y].getTopic();
				liste[y].setEmailTopic(liste[y+1].getEmail(),liste[y+1].getTopic() );
				liste[y+1].setEmail(temp);
                                liste[y+1].setTopic(temp2);
                                ergebnis[y] = liste[y].getEmailTopic();
				}

                }
                }
            
            }
        
        
   return ergebnis;
    }

Jetzt wird das Ergebnis schon sinnvoller. Ich erhalte bei oben genannten Eingabe Werten folgendes:
andre@web.de 2
andre@web.de 3
daniel@web.de 5

Es sieht schon besser aus. Es fehlen aber noch zwei Werte. Ich schätze mal das liegt an meiner "null" Prüfung. Wie kann ich die anders gestalten?
 
Ja darf ich!
 
Sehr gut, dann würde ich in die Data-Klasse diese Methode implementieren:

PHP:
public class Data implements Comparable<Data> {

	private String email, topic;

	public int compareTo(Data o) {
		return email.compareTo(o.email);
	}

	public String getEmail() {
		return email;
	}

	public String getTopic() {
		return topic;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setTopic(String topic) {
		this.topic = topic;
	}
}
Damit kannst du nun Data-Objekte miteinander vergleichen, und somit eben auch sortieren.
Jetzt baust du dir einfach ein BubbleSort zusammen, das genauso funktioniert als würdest du Integer sortieren wollen, nur benutzt du eben anstatt "<" und ">" die compareTo Methode zum vergleichen.
Hoffe das ist soweit klar, wenn nicht, einfach nochmal melden!
 
kann man sich denn nicht auch die Mühe sparen und Arrays.sort() bzw. Collections.sort() benutzen? Solange man das Interface Comparable implementiert, sollte das doch kein Problem sein. Nimmt man darüber hinaus Listen (z.B. ArrayList<xyz>), könnte man sich die Längenabfragen bei den Schleifen fragen und for-each loops nutzen.
 
@KillFrog: Könntest du mir den Code so wie du vorgeschlagen hast für die sortArticleWithAuthor() Methode mal zeigen? Mir ist das noch nicht 100%ig klar.

Meine Data Klasse habe ich mit deinen Angaben erweitert.

Danke Dir!

@CoolHandLuke: Wie funktioniert Array.sort()? Ich hab das noch nie benutzt. Deswegen würde ich es lieber mit BubbleSort probieren.
 
Ich heiß Killkrog...

PHP:
public static String[] sortArticleWithAuthor(Data[] array) {

	// Das Array sortieren, entweder über dein Bubblesort, dann musst du es aber selber schreiben, oder
	// aber eine Klasse von Java verwenden. Die benutzt 'CleverSort', eine Aberration von 'QuickSort'. Das
	// ist mit einer durchschnittlichen Laufzeit von O(n * log(n)) deutlich schneller als BubbleSort.

	// Die Methode sort() nimmt nur Arrays an von Objekten, die das Interface "Comparable" implementieren.
	// Das haben wir aber bei deiner Klasse gemacht, also kein Problem. Dieses Interface stellt sicher,
	// dass man zwei Objekte dieses Typs miteinander vergleichen kann, was essentiell ist für
	// Sortierverfahren.
	Arrays.sort(array);

	// So, nun ist das Array sortiert, also bauen wir uns jetzt das Array, das zurückgegeben werden soll.
	String[] retArray = new String[array.length];

	// Nun befüllen wir es...
	for (int i = 0; i < array.length; i++) {
		retArray[i] = array[i].getEmail() + " (" + array[i].getTopic() + ")";
	}

	// Und zurückgeben...
	return retArray;
}

// Eine noch etwas elegantere Lösung mit toString()

PHP:
public class Data implements Comparable<Data> {

	private String email, topic;

	public int compareTo(Data o) {
		return email.compareTo(o.email);
	}

	public String getEmail() {
		return email;
	}

	public String getTopic() {
		return topic;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setTopic(String topic) {
		this.topic = topic;
	}

	public String toString() {
		return email + " (" + topic + ")";
	}
}

PHP:
public static String[] sortArticleWithAuthor(Data[] array) {
	Arrays.sort(array);
	
	String[] retArray = new String[array.length];
	for (int i = 0; i < array.length; i++) {
		retArray[i] = array[i].toString();
	}
	
	return retArray;
}
 
Zuletzt bearbeitet: (Erweiterung)
Schöne Hilfestellung ohne gleich die Hausarbeit für andere zu erledigen, so sollte es immer laufen. Ich denke das reicht bis hier her an Hilfe. Etwas sollte Rucki ja auch selbst dafür tun. ;)
 
Super vielen Dank Killkrog ! :)

Ein Fehler und eine Frage habe ich noch. So habe ich es nun geändert:

Code:
public String[] sortArticleWithAuthor() { // Ich kann hier nichts ändern! Ist mir so vorgegeben.

       Data[] liste = SearchEngineSystemFrame.dbase.artikelliste;
    // Hier erhalte ich den Fehler, dass er das Symbol method.sort(Data[]) nicht findet.   
    liste.sort(liste);

    
    String[] retArray = new String[liste.length];

  
    for (int i = 0; i < liste.length; i++) {
        retArray[i] = liste[i].getEmail() + " (" + liste[i].getTopic() + ")";
    }

   
    return retArray;
}

1. Findet NetBeans das Symbol method.sort(Data[]) nicht. Muss ich noch irgendwas importieren oder sowas ähnliches?
2. Darf ich meine erste Zeile nicht ändern. Macht das was aus?

@GreenMamba:
Bin auch super zufrieden mit der Hilfestellung. Ich möchte nur anmerken, dass dies nur ein kleiner Teil (1 von 20 Methoden) in meiner Hausaufgabe ist. Den Rest habe ich zum Glück alleine noch hinbekommen. Aber nochmal super vielen Dank!
 
Zuletzt bearbeitet:
Zuletzt bearbeitet:
Danke habe es geschafft! Vielen Dank an alle!
Ergänzung ()

Ahhhh :pcangry:

Doch noch nicht alles Butter. Ich erhalte leider eine Nullpoint Exception wenn nicht alle 100 Einträge der Liste gefüllt wurden.
 
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

Zurück
Oben