Huba Geschrieben 8. Oktober 2012 Geschrieben 8. Oktober 2012 Hallo alle miteinander, ich bin neu hier und hoffe das ich hier richtig bin um meine Frage zu stellen. Ich bin ziemlich neu in der Welt des programmierens und lerne mit Java. Also.... nicht lang schnacken..... Meine Aufgabe: Ich bin grade bei Collections, listen und sortieren und soll eine Liste erstellen mit dem namen der Mitarbeiter und die der Länge nach sortieren, sind 2 Namen gleich lang, so werden die wieder mit dem Alphabet hintereinander Sortiert. Hier mein anfang: import java.util.*; public class Mitarbeiter import java.util.*; public class Mitarbeiter { public static void main(String[] args) { List<String> liste = Arrays.asList("Marcel", "Peter", "Markus", "Hans"....usw); Collections.sort(list); System.out.println(liste); } } so... Jetzt weis ich er sortiert sie automatisch nach dem Alphabet. Wäre nett wenn mir jemand bischen helfen könnte bei "eigenen comparator schreiben". Weil ich das noch nicht ganz verstanden habe. Oder ein paar Tipps. Ich hoffe, ich habe es richtig erklärt. Zitieren
sebi680 Geschrieben 8. Oktober 2012 Geschrieben 8. Oktober 2012 Hallo alle miteinander, ich bin neu hier und hoffe das ich hier richtig bin um meine Frage zu stellen. Ich bin ziemlich neu in der Welt des programmierens und lerne mit Java. Also.... nicht lang schnacken..... Meine Aufgabe: Ich bin grade bei Collections, listen und sortieren und soll eine Liste erstellen mit dem namen der Mitarbeiter und die der Länge nach sortieren, sind 2 Namen gleich lang, so werden die wieder mit dem Alphabet hintereinander Sortiert. Hier mein anfang: import java.util.*; public class Mitarbeiter import java.util.*; public class Mitarbeiter { public static void main(String[] args) { List<String> liste = Arrays.asList("Marcel", "Peter", "Markus", "Hans"....usw); Collections.sort(list); System.out.println(liste); } } so... Jetzt weis ich er sortiert sie automatisch nach dem Alphabet. Wäre nett wenn mir jemand bischen helfen könnte bei "eigenen comparator schreiben". Weil ich das noch nicht ganz verstanden habe. Oder ein paar Tipps. Ich hoffe, ich habe es richtig erklärt. Hey Na die Grundsätze hast du ja auf jeden Fall schon einmal verstanden, gut Es gibt in Java hauptsächlich zwei Möglichkeiten, Elemente in einer Collection zu sortieren, zum Einen über "die natürliche Ordnung" (Methode "compareTo" aus dem Comparable Interface) und zum anderen über einen externen "Comparator", wie du ja anscheinend auch schon weißt. Generelle Unterscheidung: - Bei "compareTo" (Interface Comparable) vergleicht sich immer ein Objekt selbst mit einem anderen - Bei "compare" (Interface Comparator) vergleicht ein drittes, außenstehendes Objekt zwei andere Objekte Die Klasse "Collections" bietet nun zum Sortieren zum einen die Methode "sort(Collection coll)" an, die dann alle Elemente über ihre natürliche Ordnung sortiert und zum Anderen die Methode "sort(Collection coll, Comparator comp)". Dieser Methode kannst du also einen Comparator mitgeben, um die Strings nach deinen Vorgaben zu sortieren und nicht nach deren natürlicher (in diesem Fall alphabetischer Ordnung). Da du erst Java lernst, weiß ich nicht, inwiefern du schon mit anonymen inneren Klassen und Generics vertraut bist. Das sind zwei Konzepte, die du für die "Musterlösung" wohl benötigst. Ich möchte dir jetzt nicht einfach die Lösung hinschreiben, da dann der Lerneffekt nicht so groß ist. Vielleicht kannst du ja mit meinen Hinweisen schon ein bisschen weiterkommen, ansonsten kannst du ja gerne noch mehr Fragen stellen. Zitieren
Huba Geschrieben 8. Oktober 2012 Autor Geschrieben 8. Oktober 2012 Hi sebi, danke für die Antwort. Ne eine Lösung will ich auch nicht direkt, wills ja auch alleine lern. . Ich häng bischen hinterher mit dem lernen, aber es bessert sich langsam. Mit anonymen inneren Klassen und Generics bin ich jetzt erlich gesagt nicht sooooo gut bewand, aber deine Tipps waren schonmal sehr gut, danke:). Ich werde diese morgen berücksichtigen und versuchen einzubauen. Zumindest das mit dem "sort(Collection coll, Comparator)" und "compareTo". Wobei ich bei "sort(Collection coll, Comparator)" nicht genau weis/verstehe was das in den klammern bedeutet ich denke mal das ist wichtig für eine methode die ich schreibe. :S Wenn ich jetzt nicht komplett auf einem schlauch stehe. Und bei "compareTo" hattest du geschrieben " vergleicht sich immer ein Objekt selbst mit einem anderen" . Bin ich richtig der ansicht das es für meine Liste sinnvoll ist? Zitieren
ExAzubi Geschrieben 8. Oktober 2012 Geschrieben 8. Oktober 2012 Tipp von mir: Erstelle eine Klasse Mitarbeiter und nimm das Interface Comperable. in der compareTo Methode die Stringlänge des Übergebenen Objektes ermitteln und mit der eigenen länge des Namen vergleichen und den passenden Wert für <=> zurückgeben. --> Fertig. So, das muss als Denkanstoß reichen Zitieren
sebi680 Geschrieben 9. Oktober 2012 Geschrieben 9. Oktober 2012 Hi sebi, danke für die Antwort. Ne eine Lösung will ich auch nicht direkt, wills ja auch alleine lern. . Ich häng bischen hinterher mit dem lernen, aber es bessert sich langsam. Mit anonymen inneren Klassen und Generics bin ich jetzt erlich gesagt nicht sooooo gut bewand, aber deine Tipps waren schonmal sehr gut, danke:). Ich werde diese morgen berücksichtigen und versuchen einzubauen. Zumindest das mit dem "sort(Collection coll, Comparator)" und "compareTo". Wobei ich bei "sort(Collection coll, Comparator)" nicht genau weis/verstehe was das in den klammern bedeutet ich denke mal das ist wichtig für eine methode die ich schreibe. :S Wenn ich jetzt nicht komplett auf einem schlauch stehe. Und bei "compareTo" hattest du geschrieben " vergleicht sich immer ein Objekt selbst mit einem anderen" . Bin ich richtig der ansicht das es für meine Liste sinnvoll ist? Das in Klammern der "sort" Methode (aus der Klasse Collections) sind die Parameter. Diese Methode ist "überladen", d.h. es gibt mehrere "Versionen" dieser Methode mit einer unterschiedlichen Anzahl an Parametern (man spricht auch von Methodenüberladung, wenn zwar die Anzahl der Parameter gleich ist, sich aber deren Typ unterscheidet). So kannst du also entscheiden, ob dieser "sort" Methode nur deine Liste übergibst (und die sort Methode sortiert die Elemente dann nach ihrer natürlichen Ordnung) oder du gibst der Methode eine Liste mit und zusätzlich ein "Comparator" Objekt und sagst damit quasi der "sort" Methode "sortiere mir alle Elemente dieser Liste nach den Regeln, die ich im Comparator definiert habe!". Wie ExAzubi es auch sagte, bietet es sich bei dir durchaus an, eine Mitarbeiter Klasse zu erstellen und in dieser "Comparable" zu implementieren (bist du mit Interfaces und dem Substitutionsprinzip oder Polymorphismus vertraut?). Allerdings arbeitet man ja oft genug mit fremden Klassen, die man nicht mehr verändern kann, sodass du in diesen Klassen, dann nicht Comparable implementieren kannst. In solchen Fällen, oder wie in deinem Fall, wenn man eigentlich ohne eigenständige Klasse leben kann, bietet es sich an, das Ganze mit einem "Comparator" Objekt zu lösen. Ebenso benötigt man generell einen Comparator, wenn man die gleichen Objekte mehrmals auf verschiedene Arten sortieren möchte...vielleicht möchtest du eine Liste von Äpfeln, die nach ihrer Sorte sortiert sind, zusätzlich aber eine weitere Liste, bei denen sie nach Größe/Gewicht/Preis/etc. sortiert sind. Ich denke es wäre gut, wenn du es auf beide Arten mal ausprogrammierst. Zitieren
Huba Geschrieben 9. Oktober 2012 Autor Geschrieben 9. Oktober 2012 Oki, danke für die Antworten, dann werde ich mal loslegen. Ich war/ bin nur bischen verwirrt weil ich bei "Java ist auch eine Insel" ein beispiel gesehen hatte. Ich finde das Buch ist gut geschrieben nur dieses Thema/Beispiel war bischen kompliziert. Aber danke nochmal. Zitieren
sebi680 Geschrieben 9. Oktober 2012 Geschrieben 9. Oktober 2012 Oki, danke für die Antworten, dann werde ich mal loslegen. Ich war/ bin nur bischen verwirrt weil ich bei "Java ist auch eine Insel" ein beispiel gesehen hatte. Ich finde das Buch ist gut geschrieben nur dieses Thema/Beispiel war bischen kompliziert. Aber danke nochmal. Für Anfänger ist das meiner Meinung nach kein gutes Buch Es ist eher ein Nachschlagewerk, aber zum Lernen geht es zum Einen teilweise deutlich zu tief in für Neulinge total unnötige Detailtiefen und ist zum Anderen auch sehr trocken geschrieben. Kann Anfängern nur immer wieder "Java von Kopf bis Fuß" empfehlen. Ich selbst habe Java vor knapp 2,5 Jahren mit der Inseln gelernt (eher lernen müssen ) und habe dann recht spät eben dieses Java von Kopf bis Fuß gelesen...du kannst dir nicht vorstellen, wie ich mich geärgert habe, dass mir am Anfang niemand dieses Buch empfohlen hat Auf die Gefahr hin, dass es dich eher verwirrt, als zu helfen, versuche ich hier mal schnell stichpunktartig alles Notwendige zusammenzufassen. - In Java kann man nur von einer Klasse erben (Class Abc extends Def), aber beliebig viele Interfaces implementieren (Class Abc implements Interface1, Interface2, Interface3, ....) - Interfaces sind VOLLSTÄNDIG abstrakte Klassen, die nur Methodendeklarationen, aber keinen Rumpf/Inhalt enthalten - Das Interface "Comparable" enthält die Methode "compareTo", die aber keinerlei Logik enthält - Durch die Implementierung eines Interfaces, ist die Klasse gezwungen (das ist ein sehr entscheidender Punkt), alle Methoden des Interfaces zu implementieren/selbst auszuprogrammieren - Wenn eine Klasse ein Interface implementiert, dann haben Objekte dieser Klasse gleichzeitig auch den Typ dieses Interfaces. Hat man z.B. "Class Auto implements FahrbaresVehikel", dann ist jedes Objekt der Auto Klasse vom Typ Auto, aber AUCH vom Typ "FahrbaresVehikel" - Dies führt dazu, dass man als Parameter (oder Rückgabewert) Interfacetypen angeben kann - Die besagte "sort" Methode aus Collections erwartet als Parameter eine Collection (egal ob Liste, Set, ...) von Objekten vom Typ "Comparable" (das wie erwähnt ein Interface ist) - Hier sind also ALLE Objekte zulässig, die das Interface Comparable implementieren, ob das eine JDK Klasse wie String oder Integer ist, oder eine von dir programmierte Klasse wie Mitarbeiter oder Hund oder Apfel ist vollkommen egal - Diese "sort" Methode weiß, dass alle diese Klassen die Methode "compareTo" Methode enthalten (da sie aufgrund der Implementierung von Comparable dazu gezwungen sind, diese zu implementieren) und kann dann die Elemente entsprechend dieser Methode sortieren Ich hoffe, dass du jetzt nicht mehr verwirrt bist als vorher^^ Zitieren
Huba Geschrieben 9. Oktober 2012 Autor Geschrieben 9. Oktober 2012 Oha cool danke, ich werde mir diese Buch direkt mal angucken. Danke für die Mühen. Eine letzte Frage noch... Hier mein bisheriger code: import java.util.*; class Mitarbeiter { String name; Mitarbeiter(String name) { this.name = name; } @Override public String toString() { return "name: " + name + ""; // ??? } } class MitarbeiterComparator implements Comparator<Mitarbeiter> { @Override public int compare(Mitarbeiter n1, Mitarbeiter n2) { if(n1.name.length() > n2.name.length()) { return -1; } else if(n1.name.length() < n2.name.length()) { return 1; } return n1.name.compareTo(n2.name); } } public class LoftMitarbeiter { public static void main(String[] args) { List<Mitarbeiter> liste = Arrays.asList(new Mitarbeiter("Thorsten"),new Mitarbeiter("Satilmis"),new Mitarbeiter("Cornelia"),new Mitarbeiter("Arnd-Henning"),new Mitarbeiter("Marcel")); Collections.sort(liste, new MitarbeiterComparator()); System.out.println(liste); } } Funktioniert so weit..... doch wie kann ich, wenn ich mehr Mitarbeiter hinzufüge, verhindern das ich jedesmal new Mitarbeiter schreibe, ist ja bischen umständlich. Ich denke mal mit einer Schleife aber wie einbauen :S. Zitieren
sebi680 Geschrieben 9. Oktober 2012 Geschrieben 9. Oktober 2012 Oha cool danke, ich werde mir diese Buch direkt mal angucken. Danke für die Mühen. Eine letzte Frage noch... Hier mein bisheriger code: import java.util.*; class Mitarbeiter { String name; Mitarbeiter(String name) { this.name = name; } @Override public String toString() { return "name: " + name + ""; // ??? } } class MitarbeiterComparator implements Comparator<Mitarbeiter> { @Override public int compare(Mitarbeiter n1, Mitarbeiter n2) { if(n1.name.length() > n2.name.length()) { return -1; } else if(n1.name.length() < n2.name.length()) { return 1; } return n1.name.compareTo(n2.name); } } public class LoftMitarbeiter { public static void main(String[] args) { List<Mitarbeiter> liste = Arrays.asList(new Mitarbeiter("Thorsten"),new Mitarbeiter("Satilmis"),new Mitarbeiter("Cornelia"),new Mitarbeiter("Arnd-Henning"),new Mitarbeiter("Marcel")); Collections.sort(liste, new MitarbeiterComparator()); System.out.println(liste); } } Funktioniert so weit..... doch wie kann ich, wenn ich mehr Mitarbeiter hinzufüge, verhindern das ich jedesmal new Mitarbeiter schreibe, ist ja bischen umständlich. Ich denke mal mit einer Schleife aber wie einbauen :S. Das sieht doch schon einmal sehr ordentlich aus Zu Übungszwecken solltest du aber wie gesagt auch noch die Lösung mit dem "Comparable" Interface schreiben. Eine Lösung für dein Problem wäre eine einfache Fabrikmethode. Du könntest ein String Array mit den Namen übergeben und dir eine Collection von Mitarbeiter Objekten zurückliefern lassen. Aber der Gedankengang, sich unnötig wiederholende und/oder sehr aufwändige Objekterzeugung auszulagern kommt den meisten Leuten (mich eingeschlossen), erst sehr viel später. Design Patterns, zu denen oben genannte Fabrikmethode auch gehört, sind übrigens ein gutes "Fortgeschrittenen"-Thema, wenn man an der Schwelle von "Ich kann Programmcode tippen" zu "Ich will schönen, robusten, wiederverwendbaren und leicht erweiterbaren Programmcode tippen können" steht. Auch zu diesem Thema gibt es ein Buch aus der "... von Kopf bis Fuß" Reihe. Sollte dir also der Stil gefallen (sehr lustig und unterhaltsam, für manche Leute aber auch unseriös), wäre das evtl. ein Buch, das du in einem halben oder einem Jahr mal anschauen könntest. Zitieren
Huba Geschrieben 9. Oktober 2012 Autor Geschrieben 9. Oktober 2012 Ja es hat Funktioniert. Mein Ausbilder meint zwar das wir zu der Fabrikmethode kommen, aber soo schwer war das gar nicht und ich habe gemerkt wo ich noch lernen muss. Dann will ich mal weiter machen. Danke nochmal:uli Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.