Namen soriteren

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hey Leute,

also ich muss hier die Namen von Personen in alphabetischer Reihenfolge sortieren. Erst wird der Nachname angeschaut und wenn der gleich ist wird der Vorname angeschaut. Leider gibt mir mein Programm da nichts aus. Kann mir da jemand weiterhelfen


Code:
/**
	 * Die Teilnehmer werden in der gesamten Teilnehmerliste alphabetisch nach 
	 * Nach- und Vornamen sortiert
	 */
	
	public void sortierenNachNamen() 
	{
		boolean namenVertauscht = true;
		int i;
		int anzahlTeilnehmer = 0; //anzahl der Teilnehmer zu Beginn
		TeilnehmendePerson vertauschen; //die Namen werden vertauscht
		
		for(i = 0; i < Uebungsgruppen.MAX_ANZAHL_TEILNEHMER *
			Uebungsgruppen.MAX_ANZAHL_GRUPPEN; i++)
		{
		
			do
			{
				namenVertauscht = false;
				for(i = teilnehmer.length - 1; i > anzahlTeilnehmer; i--)
				{
					if(teilnehmer[i].getNachname().compareToIgnoreCase
							(teilnehmer[i + 1].getNachname()) > 0)
					{
						vertauschen = teilnehmer[i];
						teilnehmer[i] = teilnehmer[i + 1];
						teilnehmer[i + 1] = vertauschen;
						namenVertauscht = true;
					}
					else if((teilnehmer[i].getNachname().compareToIgnoreCase
							(teilnehmer[i + 1].getNachname()) == 0) &&
							(teilnehmer[i].getVorname().compareToIgnoreCase
									(teilnehmer[i + 1].getVorname()) == 0))
					{
						vertauschen = teilnehmer[i];
						teilnehmer[i] = teilnehmer[i + 1];
						teilnehmer[i + 1] = vertauschen;
						namenVertauscht = true;
					}
				}
				anzahlTeilnehmer++;
			}while(namenVertauscht);
		}
	}





Das ist die Methode, die die Namen ausgeben sollte.


Code:
/**
	 * ruft die Methode aus der Klasse Uebungsgruppen auf, welche die Teilnehmer und
	 * deren Daten sortiert nach Namen zurueckgibt.
	 * @param uebungsgruppen
	 * 					die Uebungsgruppen, die ausgegeben werden sollen
	 */
	public void gibTeilnehmerAus(Uebungsgruppen uebungsgruppen) 
	{
		int anzahl = 0;	//anzahl der Teilnehmer zu Beginn
		
		//getNachNamenSortierteTeilnehmer, ist die Methode, die die Teilnehmerliste
		//der Methode sortierenNachNamen() zurückgibt
		TeilnehmendePerson[] studenten = uebungsgruppen.getNachNamenSortierteTeilnehmer();
				
		for(int i = 0; i < studenten.length; i++) {
		
			if(studenten[i] != null) {
				anzahl++;
			}
		}
		if(anzahl > 0) {
			for(int i = 0; i < anzahl; i++) {
				Ausgabe.schreib(studenten[i].toString());
				Ausgabe.neueZeile();
			}
		}
		else {
			Ausgabe.schreib("Keine Teilnehmer vorhanden! \n\n");
		}
	}
 
das mit dem Interface Comparable kenn ich nicht. Gibt es keine andere Möglichkeit? Also ich weiß ja das meine Implementierung falsch ist, aber was hab ich denn da falsch gemacht?
 
Code:
 else if((teilnehmer[i].getNachname().compareToIgnoreCase
                     (teilnehmer[i + 1].getNachname()) == 0) &&
                     (teilnehmer[i].getVorname().compareToIgnoreCase
                           (teilnehmer[i + 1].getVorname()) == 0))
               {
                  vertauschen = teilnehmer[i];
                  teilnehmer[i] = teilnehmer[i + 1];
                  teilnehmer[i + 1] = vertauschen;
                  namenVertauscht = true;
               }

Warum Verstauchst du denn, wenn alles gleich ist ?
 
dann setz dich mal mit Comparable auseinander. Ist sehr praktisch und für dienen Zweck vollkommen ausreichend.


Code:
public class TeilnehmendePerson implements Comparable{

public int compareTo(TeilnehmendePerson tp) {
 return 0 // this ist identisch mit tp
 return 1 // tp ist größer als this
 return -1 // tp ist kleiner als this
}

bin mir jetzt nicht sicher, ob die Syntax so stimmt, kann gut sein, dasds ich die RÜckgabefälle 1 und -1 gerade verwechsle... aber so prinzipiell stimmts
 
also prinzipiell schon, sofern du toString() geeignet überschrieben hast.

geht aber auch einfacher..

Code:
List<TeilnehmendePerson> list = ...

if(list.isEmpty()) {
sysout("Kein Teilnehmer vorhanden!");
}
for(tp : list) {
  sysout(tp.toString());
}
 
also ich hab mir das Comparable mal angeschaut. Was ich davon verstanden hab, hab ich mal versucht umzusetzen. Das sieht dann bei mir so aus:


Das Interface Comparable...

Code:
public interface Comparable 
{
	public int compareTo(Object obj);
}



...und die Klasse TeilnehmendePerson mit der Methode "compareTo()"

Code:
public class TeilnehmendePerson implements Comparable
{	
	public int compareTo(Object obj)
	{
		if(nachname < ((TeilnehmendePerson)obj).getNachname())
		{
			return -1;
		}
		else if(nachname == ((TeilnehmendePerson)obj).getNachname())
		{
			return 0;
		}
		else
		{
			return 1;
		}
	}
...
 
achso, was ich vergessen hab oben noch dazu zu sagen. In der Methode "compareTo()" zeigt er mir das in der Klammer in Zeile 6 als Fehler
 
Najo, nachname und getNachname() liefern Strings?

In dem Fall:

Code:
public class TeilnehmendePerson implements Comparable 
{    
   public int compareTo(Object obj) 
   { 
      if(nachname.compareTo( ((TeilnehmendePerson)obj).getNachname()) == -1 ) 
      { 
         return -1; 
      } 
      else if(nachname.equals((TeilnehmendePerson)obj).getNachname()) 
      { 
         return 0; 
      } 
      else 
      { 
         return 1; 
      } 
   } 
...

Wie CompareTo funktioniert, weißt du ja mitlerweile. Genau diese Methode benutzt du dann halt auch zum Vergleich der beiden Strings. (der Operator < ist nicht definiert)

Wenn ich deinen Code richtig durchschaue, könntest du auch einfach
Code:
public class TeilnehmendePerson implements Comparable 
{    
   public int compareTo(Object obj) 
   { 
return nachname.compareTo( ((TeilnehmendePerson)obj).getNachname());
        } 
...
benutzen, da du nur den Nachnahmen abgleichst. Wenn du das aber erweitern willst, dann natürlich wie oben.

Übrigens - ganz wichtig für Stringvergleiche: http://www.java-forum.org/de/viewtopic.php?t=1528
 
The operator < is undefined for the argument types java.lang.String, java.lang.String
 
@martram. dein code zeigt in zeile 9 einen Fehler, also in der Bedingung. Kann es vielleicht sein, dass nach "getNachname()" noch "== 0" hinkommt?
 
Hihi, das passiert, wenn man ohne IDE tippt 😀

Code:
 else if( nachname.equals ( ((TeilnehmendePerson)obj) .getNachname()) )

so funktioniert es. (Hatte eine Klammer vergessen.)

FAQ - Beitrag gelesen? In dem Fall gehe ich nicht den Umweg über die compareTo Methode (die da 0 liefern würde, richtig), sondern schaue direkt nach, ob die beiden Strings gleich sind.

Das geschieht über equals - wobei die Syntax String1.equals(String 2) ist. Die Methode liefert einen boolean (Wahrheitswert) zurück:

Wenn die Strings gleich sind - true
ansonsten - false
 
das mit der Klammer hab ich schon gemerkt. Hab es auch hingemacht, aber ich bekomm die Meldung: Type Mismatch. Cannot convert from int to boolean
 
achso nein. sorry. das war falsch was ich eben geschrieben hab. Die Meldung lautet: Cannot invoke getNachname() on the primitive type boolean
 
aach jetzt hab ichs🙂 sorry. war mein fehler. du hattest alles richtig gemacht
 
diese Methode "compareTo()" muss ich die dann jetzt in meine Methode "sortierenNachNamen() einbauen oder? Oder muss ich diese Methode jetz ganz ändern?
(die Methode ist auf der ersten Seite ganz oben)
 
Du hast irgendwo eine Klasse Teilnehmer.
Diese Klasse implementiert das Interface Comparable.
Code:
class Teilnehmer implements Comparable{...}
Dadurch benötigt diese Klasse eine Methode
Code:
int compareTo(Object o){
return irgendeinintwert;
}
Diese Methode liefert einen Integerwert zurück der angibt ob das übergebene Objekt o vor oder nach dem Objekt auf dem es aufgerufen wird (this) einzuordnen ist.

Nun hast du irgendwo ein Array:
Code:
Teilnehmer[] teilnehmer = new Teilnehmer[20];

Wenn du nun möchtest das dieses Array sortiert wird rufe
Code:
Arrays.sort(teilnehmer);
auf. Wenn du nun dieses Array ausgibst ist es sortiert. Wenn du nun etwas an dem Array änderst, rufe danach wiederum
Code:
Arrays.sort(teilnehmer);
auf um ein sortiertes Array zu erhalten.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben