LinkedList sortieren

Permafrost

Mitglied
ich hoffe das reicht an code um es zu erklären.
ich möchte eine ausgabe bekommen die in etwa so aussieht:
Code:
          Katze:
          Nick
          Nick
          Hund:
          Nick ....
würde mich freuen wenn ihr mir helfen könnt.
Java:
package animals;

import java.util.Collections;

import java.util.Scanner;
import java.util.LinkedList;

public class Main {

    //public static Animal oSelected;
    static LinkedList<Animal> zoo = new LinkedList<Animal>();

    /**
     *
     * @param args
     */
    public static void main(String[] args) {

        boolean bExit = false;

        Animal oSelect;
        while (!bExit) {

            oSelect = select();
            if (oSelect == null) {

                bExit = true;
                continue;
            }


        }

    }

    private static Animal select() {
        try {
            Animal oSelect = null;
            boolean bExit = false;

            do {
                System.out.println("\nBitte wählen Sie :");
                System.out.println("Tier ansehen  \t<a>");
                System.out.println("Tier erstellen\t<e>");
                System.out.println("Beenden       \t<b>");

                Scanner oScanner = new Scanner(System.in);
                char chInput = oScanner.next().charAt(0);   // gibt char zurück

                switch (chInput) {
                    case 'a':

                        Main.selectAnimal(false);
                        break;
                    case 'e':
                        Main.createAnimal();

                        break;
                    case 'b':
                        bExit = true;
                        oSelect = null;

                        break;
                    default:

                        System.err.println("Sie haben einen falschen Buchstaben eingegeben.");
                }

            } while (!bExit);

            return oSelect;

        } catch (Exception oExc) // erstelle Exception Objekt
        {
            oExc.printStackTrace(); // gebe Ausnahme aus (Objekt)
            return null;
        }
    }

    private static Animal createAnimal() {
        boolean bStatus;

        try {
            Animal oSelected = null;
            boolean bExit2 = false;


            do {
                // Ausgabe
                System.out.println("\nBitte suchen Sie sich ein Tier aus :");
                System.out.println("Katze         \t<k>");
                System.out.println("Hund          \t<h>");
                System.out.println("Maus          \t<m>");
                System.out.println("Zurück        \t<z>");


                // Eingabe
                Scanner oScanner = new Scanner(System.in);
                char chInput = oScanner.next().charAt(0);   // gibt char zurück

                switch (chInput) {
                    case 'k':
                        oSelected = new Cat();
                        zoo.add(oSelected);
                        break;
                    case 'h':
                        oSelected = new Dog();
                        zoo.add(oSelected);
                        break;
                    case 'm':
                        oSelected = new Mouse();
                        zoo.add(oSelected);
                        break;
                    case 'z':
                        bExit2 = true;
                        break;
                    default:
                        System.err.println("Sie haben einen falschen Buchstaben eingegeben.");
                }
            } while (oSelected == null && !bExit2);
            //Ausgabe Nickname
            System.out.println("\nBitte geben Sie den Spitznamen des Tieres ein.");
            Scanner oScanner = new Scanner(System.in);
            oSelected.setNickname(oScanner.next());
            System.out.println("\nBitte geben Sie das Datum in tt.mm.jjjj");
            
            bStatus = true;
            while (bStatus) {
            
            //Ausgabe Datum
            
            Birthday oDate = new Birthday();
            
            
            if (!oDate.checkSyntax(oScanner.next())) {
            System.err.println("falsche Datumssyntax");
            continue;
            }
            oSelected.setBd(oDate);
            bStatus = false;
            }                                                                         


            return oSelected;
        } catch (Exception oExc) // erstelle Exception Objekt
        {
            oExc.printStackTrace(); // gebe Ausnahme aus (Objekt)
            return null;
        }
    }

    public static boolean selectAnimal(boolean bSelectAnimal) {
        String nickname;
        try {

            bSelectAnimal = false;

            do {
                System.out.println("\nBitte wählen Sie ein Menüpunkt aus.");
                System.out.println("Name          \t<n>");
                System.out.println("Alle Tiere    \t<a>");
                System.out.println("Zurück        \t<z>");

                Scanner oScanner = new Scanner(System.in);
                char chInput = oScanner.next().charAt(0);

                switch (chInput) {
                    case 'a':

                       [COLOR="Red"] //Hier ist mein Problem[/COLOR]

                        break;
                    case 'n': {
                        System.out.println("\nBitte geben sie den Namen des Tieres ein:");
                        nickname = oScanner.next();
                        Animal oMyAnimal = null;
                        int i = 0;
                        boolean bFound = false;
                        while (i < zoo.size() && !bFound) {
                            oMyAnimal = zoo.get(i);
                            bFound = oMyAnimal.getNickname().equals(nickname);
                            i++;
                        }
                        if (bFound) {
                            // Jetzt Menü für oMyAnimal aufrufen
                            oMyAnimal.setIndex(false);
                        } else {
                            // Fehlerbehandlung: Tier nicht vorhanden
                            System.out.println("Dieses Tier gibt es nicht!");
                            break;
                        }
                    }
                    case 'z': {
                        return true;
                    }
                    default: {

                        System.err.println("Sie haben ein falsches Zeichen eingegeben");
                        break;
                    }
                }
            } while (!bSelectAnimal);

        } catch (Exception oExc) // erstelle Exception Objekt
        {
            oExc.printStackTrace(); // gebe Ausnahme aus (Objekt)
            bSelectAnimal = false;
        }

        return bSelectAnimal = true;

    }
}
 
Zuletzt bearbeitet von einem Moderator:
Hm.. ich würd sagen, da würde sich eine andere Struktur als eine LinkedList anbieten. LinkedList ordnet es ja keinem Oberbegriff zu, sondern reiht die Begriffe aneinander und merkt sich die "Nachbarn" 🙂

Ansonsten könntest du natürlich die LinkedList sortieren, oder alternativ die gesamte LinkedList durchsuchen und die Zwischenergebnisse in einzelne Listen speichern... usw.. also Möglichkeiten gibt es genug.

Müsstest eventuell ein bisschen mehr über die Aufgabe bzw. Vorgaben verraten und wo dein Problem ist, damit man dir besser helfen kann? 😀 (wo soll die Ausgabe erscheinen und wann?)
 
ich wusste nicht wie ich es formulieren sollte also
bei SelectAnimal bei case a
Alle Tiere soll es rein
nun möchte ich aber bei LinkedList bleiben ^^
ich hatte es schon mal versucht mein ergebnis sah so aus:

Java:
                        for (Animal animal : zoo)
                        {
                            
                            
   
                            if (animal.sName.equals("Katze")){
                                
                                boolean bExit= true;
                                do {
                                    System.out.println("Katzen :");
                                    bExit = false;
                                }while (bExit);
                                System.out.println(animal.msNickname);
                            }
                            //System.out.println(animal.sName + " " + animal.msNickname);

                        }

Nur da bekomme ich dann immer nur das raus

Code:
         katze:
         nick
         katze:
         nick
 
Vielleicht einfach [c]Collections.sort(Zoo)[/c] und [c]System.out.println(Zoo)[/c]

Fürs sortieren könnte man eine eigene [c]Comparator[/c] -Klasse implementieren.
 
Über Struktur und Sinn könnte man lange diskutieren. LinkedList (statt List) ist nicht schön, die Aufgaben bzw. die Verwaltung des "Datenmodells" sind unschön mit diesem Pseudo-Konsolen-Menü verwurstet...
In der Tat ist das, was dort passieren soll, eine Art "sortierte" Ausgabe ( :lol: ) aber... du könntest mal über eine Methode nachdenken, wie z.B.
Java:
private static List<Animal> getByType(List<Animal> animals, String type) { ... }
damit du sowas machen könntest wie
Java:
List<Animal> cats = getByType(zoo, typeThatWasEnteredByUser);
for (Animal a : cats)
{
    System.out.println(a);
}
(und die Methode "getByName" könnte es früher oder später wohl auch geben)
 
danke dir^^hab schon ein bisschen was geschaft
Java:
                        Animal oAnimal = null;
                        Collections.sort(zoo,new Sort());
                        System.out.println(oAnimal.getSort());
Java:
 class Sort<o1 extends Animal> implements Comparator{



    public int compare(o1 arg0) {
        Animal mob1 = arg0;

        return mob1.getSort();
    }

    public int compare(Object o1, Object o2) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
 
Dein Comparator bringt also eigentlich überhaupt nichts. Weisst du auch, was du tust? Du sollst die Methode [c]compare(T, T)[/c] überschreiben 😉
Also so was:
Java:
public class Sort implements Comparator<T extends Animal> {
 
    public int compare(T o1, T o2) {
        return o1.getSort().compareTo(o2.getSort());
    }
}[/Java]
 
nein ich habe leider keine ahnung da ich das zum ersten mal mache und noch nicht so lange java lerne und ein bisschen schwer von kape bin momentan grins^^ ist ja nicht einfach
kannst du mir den code ein bisschen erklären damit ich ihn verstehe? bzw wie ich an so einen rangehen soll?
ich verstehe zum beispiel nicht warum ich einen fehler bekomme bei der ersten zeile die du geschrieben hast
der fehler:
> expected
irgentwas muss bei T nicht in ordnung sein
ich arbeite mit NetBeans IDE 6.9.1
 
mit
Java:
class Sort implements Comparator<Animal> {
    
    public int compare(Animal o1, Animal o2) {
        return o1.getSort().compareTo(o2.getSort());
    }
}
sollte es gehen...
 
Du könntest allerdings auch mit der Klasse Animal das Comparable-Interface implementieren (oder bin ich noch zu müde und überseh etwas nicht?).

Quick und dirty:
Java:
public class Animal implements Comparable{

    public Animal(String name){
        this.name = name;
    }
    
    String name;

    @Override
    public int compareTo(Object o) {
        if(o instanceof Animal){
            if(o.getClass() == this.getClass())
                return this.name.compareTo(((Animal)o).name);
             else
                return this.getClass().toString().compareTo(o.getClass().toString());
        } else 
            throw new ClassFormatError("Kein Animal");
    }
}

und anschließend müsste sich die LinkedList doch mit
Java:
Collections.sort(zoo);
sortieren lassen?
 
so hab ich geschrieben nur mit compareTo kann doch was nicht stimmen oder ?
Java:
public class Sort implements Comparator<Animal> {

    public int compare(Animal o1, Animal o2) {
        return o1.getSort().compareTo(o2.getSort());
    }
}
in Animal
Java:
Object getSort() {
        return msSort;
    }
 
[...] kannst du mir den code ein bisschen erklären damit ich ihn verstehe? bzw wie ich an so einen rangehen soll?
Was verstehst du nicht?
ich verstehe zum beispiel nicht warum ich einen fehler bekomme bei der ersten zeile die du geschrieben hast

Tschuldigung, Flüchtigkeitsfehler... Sollte natürlich
Java:
public class Sort<T> implements Comparator<T extends Animal>
sein, oder eben als Alternative
Java:
public class Sort implements Comparator<Animal>
.
 
geht das eigentlich auch ohne interface? weil ich das selber noch nicht hatte evtl geht es dann leichter für mich es zu verstehen
bin ich eigentlich mit meinen gedanken weg richtig :
ich habe Linkedlist zoo die spalte ich in die drei tierarten
katze hund und maus
diese tierarten werden je einzelne linkedlisten
in diese sind die nicks der tiere eingespeichert
und so kann ich sie dann ausgeben komplett und nach abfrage einzeln

ist mein gedankenweg möglich?
ich möchte es ja verstehen deswegen keinen fertigen code bitte sonst lerne ich ja nix
 
Soweit ich deine Text entziffern kann (Groß-Klein-Schreibung & Satzzeichen sind schon toll manchmal) sollte das gehen. Du kannst Klassen mischen, wenn sie eine gemeinsame Oberklasse implementieren. Dann kannst du aber auch nur auf Methoden der Oberklasse zugreifen.

Wenn du 3 Listen hast und die jeweils die einzelnen Tierarten enthalten kannst du die spezielleren Methoden aufrufen.
 
so hab es geschaft mir hat ein kolege geholfen *glücklich*

selectAnimal()
Java:
             case 'a':
                        printAnimalNames(zoo);
                        break;

Java:
private static List<String> getAnimalTypes (List<Animal> oZoo){
        List<String> oTypes = new LinkedList<String> ();
        for (Animal oAnimal: oZoo) {
            boolean bEnde = false;
            for (String Types: oTypes){

                if (oAnimal.sName.equalsIgnoreCase(Types))
                {
                    bEnde = true;
                    break;
                }
            }
            if (!bEnde){
               oTypes.add(oAnimal.sName);
            }

        }
        return oTypes;
    }

Java:
private static List<String> getAnimalNames (List<Animal> oZoo, String sName)
    {
        List<String> oNicknames = new LinkedList<String>();
        for (Animal oAnimal:oZoo)
        {
            if (oAnimal.sName.equalsIgnoreCase(sName))
            {

                oNicknames.add(oAnimal.msNickname);
            }
        }
        return oNicknames;
    }

Java:
private static boolean printAnimalNames (List<Animal> oZoo)
    {
        List<String> oTypes = new LinkedList<String>();
        oTypes.addAll(getAnimalTypes(oZoo));
        for (String sTypes: oTypes)
        {
            System.out.println(" ");
            System.out.println(sTypes);
            List<String> oNicknames =new LinkedList<String>();
            oNicknames.addAll(getAnimalNames(oZoo,sTypes));
            for (String sNicknames: oNicknames)
                System.out.println(sNicknames);
        }

    return true;
    }

Danke aber auch für eure hilfe

jetzt hatte ich ganz vergessen zu fragen wie findet ihr den den?

ps.: Was ist Rechtschreibung? Nie davon gehört^^
 
Zuletzt bearbeitet:
Muss noch mal nerven und die tier geschichte hört nicht auf^^
Wie kann man den das Menü löschen?
Nach der Eingabe sollte dies automatisch funktionieren.
Habe bis jetzt nichts brauchbares gefunden.
Währe lieb wenn ihr mir helfen könntet.
 

Neue Themen


Zurück
Oben