Namen soriteren

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");
		}
	}
 
G

Gast

Gast
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?
 

jPat

Bekanntes Mitglied
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 ?
 

FelixB

Bekanntes Mitglied
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
 

FelixB

Bekanntes Mitglied
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());
}
 
G

Gast

Gast
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;
		}
	}
...
 
G

Gast

Gast
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
 

martram

Aktives Mitglied
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
 
G

Gast

Gast
The operator < is undefined for the argument types java.lang.String, java.lang.String
 
G

Gast

Gast
@martram. dein code zeigt in zeile 9 einen Fehler, also in der Bedingung. Kann es vielleicht sein, dass nach "getNachname()" noch "== 0" hinkommt?
 

martram

Aktives Mitglied
Hihi, das passiert, wenn man ohne IDE tippt :D

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
 
G

Gast

Gast
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
 
G

Gast

Gast
achso nein. sorry. das war falsch was ich eben geschrieben hab. Die Meldung lautet: Cannot invoke getNachname() on the primitive type boolean
 
G

Gast

Gast
aach jetzt hab ichs:) sorry. war mein fehler. du hattest alles richtig gemacht
 
G

Gast

Gast
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)
 
G

Gast

Gast
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
sserio TXT-Datei Auslesen und den Wert jedes Namen ausrechnen etc. Java Basics - Anfänger-Themen 37
M Arrayliste mit beliebig vielen Namen befüllen Java Basics - Anfänger-Themen 4
L loop für Namen Java Basics - Anfänger-Themen 11
HoT verschiedene ArrayLists mit ähnlichem Namen in for-Schleife aufrufen Java Basics - Anfänger-Themen 3
O Namen (mit Umlauten und ß) in einer ArrayList suchen Java Basics - Anfänger-Themen 5
P Methoden Namen trennen mit .substring(), char.At(), .lenght() Java Basics - Anfänger-Themen 8
F Jtree kürzt Namen auf ... Java Basics - Anfänger-Themen 4
B Automatisch Objekte erzeugen mit verschiedenen Namen Java Basics - Anfänger-Themen 4
L Dynamische Anzahl an Arrays mit verschiedenen Namen erzeugen Java Basics - Anfänger-Themen 6
B Datentypen Datentyp welcher den gleichen Namen wie die Klasse trägt? Java Basics - Anfänger-Themen 1
S Variablen Flexible Variablen Namen Java Basics - Anfänger-Themen 3
N Konstruktoraufruf mit "variablem" Namen Java Basics - Anfänger-Themen 5
feinperligekohlensaeure Arraylisten-Namen iterieren.. wie ? Java Basics - Anfänger-Themen 39
S Objekte mit gleichem Namen in unterschiedlichen Klassen Java Basics - Anfänger-Themen 3
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
Silvascus Array, der mit dem Namen, der per Methode übergeben wird, erstellt wird Java Basics - Anfänger-Themen 5
K Methoden mit den Namen accept. Welche Funktion haben diese? Java Basics - Anfänger-Themen 2
H Namen abgleichen Java Basics - Anfänger-Themen 3
M Datei-Namen aus .jar auslesen Java Basics - Anfänger-Themen 7
A Wie am effizientesten bzw. schnellsten Namen/Wörter sortieren? Java Basics - Anfänger-Themen 1
S Strings im Array nach Namen sortieren Java Basics - Anfänger-Themen 11
L Namen aus Textdatei auslesen Java Basics - Anfänger-Themen 1
J JLabels in schleife erzeugen mit verschiedenen namen? Java Basics - Anfänger-Themen 5
E Array von Objekten einer selbst definierten Klasse mit eindeutigem Namen Java Basics - Anfänger-Themen 2
D Interface namen bekommen Java Basics - Anfänger-Themen 3
K Best Practice In Klassen auf andere Objekte mit variablen Namen zugreifen Java Basics - Anfänger-Themen 6
X Variablen Actionlistener | Variablen-namen Java Basics - Anfänger-Themen 5
O Prüfen ob ein String den selben Namen hat wie eine Booleanreihe? Java Basics - Anfänger-Themen 17
K Doppelte namen bei random Java Basics - Anfänger-Themen 3
K Einfacher random namen weitergeben Java Basics - Anfänger-Themen 4
D String mit Integer Variablen Namen vergleichen, möglich? Java Basics - Anfänger-Themen 6
V Variablen/Objekt Namen hochzählen Java Basics - Anfänger-Themen 4
Kenan89 Nach Namen einer Klasse fragen Java Basics - Anfänger-Themen 6
O variablen String Namen Java Basics - Anfänger-Themen 11
B JFrame - Namen anzeigen Java Basics - Anfänger-Themen 2
K Klassen Objekt mit einem Namen von einer bestimmten Klasse instanziieren Java Basics - Anfänger-Themen 10
G Namen der Generic Klasse Java Basics - Anfänger-Themen 3
B Font Namen ermitteln Java Basics - Anfänger-Themen 7
Luk10 Package Namen Java Basics - Anfänger-Themen 5
M Input/Output Namen der Files aus einem Ordner MIT bestimmten Encoding auslesen? Java Basics - Anfänger-Themen 3
I Namen eines Elements aus 2 Variablen zusammenbasteln Java Basics - Anfänger-Themen 7
C Methoden mit wechselndem Namen in Schleife aufrufen Java Basics - Anfänger-Themen 11
A Gruppen von Namen erkennen Java Basics - Anfänger-Themen 21
J Pfad bzw. Namen einer Datei auslesen Java Basics - Anfänger-Themen 6
D Javamail - Absender-Namen einfügen? Java Basics - Anfänger-Themen 2
C AbstractTableModel Spalten-Namen Java Basics - Anfänger-Themen 3
M Package Namen ändern Java Basics - Anfänger-Themen 3
O Kann ich für Array-Namen Variablen verwenden? Java Basics - Anfänger-Themen 2
M Namen der Elemente auf ContentPane? Wie darauf zugreifen? Java Basics - Anfänger-Themen 2
B Konstruktor namen wird nicht erkannt Java Basics - Anfänger-Themen 9
H Expliziten Namen angeben Java Basics - Anfänger-Themen 2
G Namen von ArrayListen dynamisch erzeugen Java Basics - Anfänger-Themen 4
E Hilfed, ide bitte de Namen wählt Java Basics - Anfänger-Themen 5
P Namen Programm Java Basics - Anfänger-Themen 5
W Variable mit Namen aus Variablen deklarieren Java Basics - Anfänger-Themen 2
S Nach Namen sortieren und diese in 3 Gruppen aufteilen Java Basics - Anfänger-Themen 16
W Objekt-Namen aus Variablennamen erstellen Java Basics - Anfänger-Themen 7
G Welchen package-Namen wählen, wenn man keine Domain hat? Java Basics - Anfänger-Themen 11
P Suche Namen für eine Komponente Java Basics - Anfänger-Themen 13
F Kann man den Namen einer Variable in ein String Konvertieren Java Basics - Anfänger-Themen 2
G Eingegebene Namen sortieren Java Basics - Anfänger-Themen 2
G Namen alphabetisch sortieren Java Basics - Anfänger-Themen 3
M Namen der Dateien in einem bestimmten Verzeichnis erhalten Java Basics - Anfänger-Themen 4
D Welchen Namen darf ein Konstruktor haben? Java Basics - Anfänger-Themen 6
J Methode mit gleichem Namen in verebter Klasse und Interface Java Basics - Anfänger-Themen 5
T Namen und RGB Wert extrahieren? Java Basics - Anfänger-Themen 2
S einlesen von dateien mit var. namen Java Basics - Anfänger-Themen 6
G ArrayList mit Namen belegen Java Basics - Anfänger-Themen 5
R Finde meinen Fehler nicht! - Namen von Personen vergleichen Java Basics - Anfänger-Themen 6
G Objekt Namen dynamisch vergeben. Java Basics - Anfänger-Themen 7
M Namen der eigenen Klasse ermitteln Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben