# Elemente sortiert in Liste einfügen



## tinki (7. Jan 2011)

Hallo!
Ich muss eine einfach verkettete Liste in Java implementieren. In meiner bereits vorgegebenen Klasse Attendee werden Attribute wie zB String name usw. angegeben. Nun möchte ich beim Anlegen eines neuen attendees zuerst überprüfen, ob der Name bereits vorhanden ist (wenn nicht - Rückmeldung an Benutzer, dass dieser attendee schon angelegt wurde) und dann soll dieser noch alphabetisch richtig in die Liste eingegliedert werden.
Ich verstehe einfach nicht, welche compare - compareTo - comparator - comparable - sort .... ??? - Methode ich hier am besten verwende - außerdem verstehe ich die Verwendung dieser Methoden einfach nicht so richtig, glaube ich.
Ich habe das Gefühl, dass mir einfach ein richtiger Denkanstoß fehlt...

Bitte um Hilfe!

DANKE!!!
LG, Tinki


----------



## SlaterB (7. Jan 2011)

angenommen du hättest auf Papier aufgemalt vor dir liegen 10 Zahlen in Reihenfolge 
und willst jetzt eine bestimmte Zahl x irgendwo dazwischenkrakeln, an sortiert an richtiger Stelle,
würdest du das mit Kopf, Augen, Arm und Stift hinbekommen? 
wie wäre dein Vorgehen ungefähr wenn du mal versuchst das in einzelne beschreibbare Schritte zu zerlegen


----------



## tinki (7. Jan 2011)

ich würde die Liste vom ersten Element aus durchgehen und dann jedes Element der Liste mit dem Element, das ich einfügen möchte vergleichen: wenn das Listenelement kleiner ist, als mein einf.Element, dann springe ich zum nächsten Listenelement und vergleiche das. Ist das Listenelement größer, muss mein einf.Element davor eingefügt werden - ist es gleich, darf das einf.Element nicht eingefügt werden ...

soweit krieg ichs glaub ich noch hin...
hilft mir aber wenig dabei, die richtige Sortiermethode für mich zu finden...


----------



## SlaterB (7. Jan 2011)

wenn du eine Liste sortieren willst gibt es Collections.sort

ansonsten musst du (im einfachen Fall) so arbeiten wie beschreiben, die Liste durchlaufen und immer schön Elemente vergleichen,
auf welche Weise du das machst ist dir überlassen, du kannst ganz ohne Standard-Methoden auskommen,
der Standardweg ist aber immer object.compareTo(object)


----------



## tinki (7. Jan 2011)

wenn ich nun compareTo verwende - weiß dann die Methode von selbst, dass a vor b vor c usw. kommt und würde sie automatisch erkennen, dass Hans < Harald ist?


----------



## ARadauer (7. Jan 2011)

> compare - compareTo - comparator - comparable - sort


naja wenn du die liste selber implementierst brauchst du kein sort, comperator und comparable...
du musst wissen ob ein name größer oder kleiner ist als ein anderer und dass kannst du mit compareTo machen


----------



## SlaterB (7. Jan 2011)

wenn diese Methode vorhanden ist, längst nicht bei allen Klassen, dann ist sie in der Regel auch sinnvoll implementiert,
String z.B. vergleicht, ja, wenn auch mit Macken, z.B. bei deutschen Umlauten


```
public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Andi".compareTo("Berta"));
        System.out.println("Ändi".compareTo("Berta"));
    }
}
```


----------



## tinki (7. Jan 2011)

hmmm....das ist mein Versuch (funktioniert noch nicht - aber ich habe das Gefühl, ich mach noch grob was falsch - bitte um Hilfe!)


```
public boolean addAttendee (Attendee attendee) {
		Attendee search = head;
		Attendee searchPrev = null;
		while (search != null && !attendee.equals(search)) {
			switch (attendee.compareTo(search)) {
				case 1: {
					searchPrev = search;
					search = search.next;
					return true;
					break;
				}
				case -1: {
					attendee.next = search;
					if (searchPrev == null) {
						head = attendee;
					} else {						
						searchPrev.next = attendee;
					}
					return true;
					break;
				}
				case 0: {
					return false;
					break;
				}
			}
					
			
			
		}
	}
```


----------



## SlaterB (7. Jan 2011)

schau dir den Rückgabewert von attendee.compareTo(search) an, ob das immer genau -1, 0, 1 oder auch was anderes ist..

wenn du in jedem Fall mit return die Bearbeitung beendest, dann bräuchtest du gar keine Schleife


----------



## tinki (7. Jan 2011)

oh mann - ich versteh das einfach nicht...

ich hab das Programm jetzt so umgeschrieben:


```
public boolean addAttendee (Attendee attendee) {
		boolean add = false;
		Attendee search = head;
		Attendee searchPrev = null;
		while (search != null && !attendee.getName().equals(search.getName())) {
			if ((attendee.getName().compareTo(search.getName())) < 0) {

				searchPrev = search;
				search = search.next;
				add = true;
					
			} else if ((attendee.getName().compareTo(search.getName())) > 0) {

				attendee.next = search.next;
				if (searchPrev == null) {
					head = attendee;
				} else {						
					searchPrev.next = attendee;
				}
				add = true;

				
				}

		}
			
		
		if (attendee.getName().equals(search.getName())) {
			System.out.println("Name bereits vorhanden!");
			add = false;
		}
		return add;
	}
```

In einem Testprogramm habe ich versucht, einen neuen attendee zu erstellen.
Die Sache funktioniert, wenn ich einen attendee erstelle, der einen bereits vorhandenen Namen hat - dann krieg ich eine Meldung, dass der schon da ist und nicht in die Liste aufgenommen werden kann.
Aber wenn ich nun andere attendees mit anderen Namen erstelle, funktionierts nicht...

komischerweise lässt sich das Programm compilieren, aber es terminiert dann nicht mehr...

HILFE! Bitte!


----------



## SlaterB (7. Jan 2011)

ich habs mir nun 5 Min. angeschaut und glaube den Fehler zu sehen, aber wenn du jetzt einfach an jeder Stelle, an der du vermeintlich nicht weiterkommt, hier fragst,
dann bringt das direkte Lösen ja nur die nächste Frage..

Gegenfrage: warum sollte es terminieren?
du musst für jeden Ablauf planen, was wann passieren soll, 
z.B. hast du jetzt in der Schleife überhaupt kein return oder break mehr, wird diese überhaupt wenn wann ja wann wo wie warum beendet?

günstig ist allgemein alternativ zu eigenen Überlegungen, ein Log einzubauen,
zu Beginn jeder Schleife ein System.out.println() mit dem aktuell verglichenen Element, in jedem if genauso usw.
wenn 1 Mio. Ausgaben pro Sekunde kommen hilft Thread.sleep(300) mit try/catch drumherum zur Verlangsamung

aus dem Log läßt sich dann im Fehlerfalle oft die Erklärung finden bzw. man kann es dahin erweitern


----------

