OOP Obstliste nach dem Alphabet sortieren

DFPWare

Mitglied
Hey Leute,
ich markier das wichtigste mal FETT :D
wir programmieren in der Schule mit BlueJ mit SuM Erweiterung.

Wir haben eine vorgegebene Klasse List und in die werden Objekte vom Typ Fruits gespeichert (die Klasse Fruits habe ich auch schon fertig).
Ich kann auch alle Objekte mit Namen und Gewicht ausgeben lassen, alles schon fertig.

Mein Problem ist aber, dass ich gerne die Objekte nach Namen sortieren lassen würde.
Theoretisch sollte es auch klappen, was ich gebastelt habe, aber mein Programm kennt die Klasse Node nicht, da ich sie irgendwie nicht einbeziehen kann. Ich will die Node Objekte in einer Variable speichern, die dann logischerweise auch vom Typ Node sein muss. Ich hab mal in meinen Unterlagen gekramt und eine kennt-Beziehung gefunden, aber ich weiß nicht mehr genau wie ich die jetzt implementiere.

Ich hoffe das war verständlich :oops:

Hier der Code der 3 Klassen:

List(die war vorgegeben):
Java:
public class List

{ private Node first, tail, current;

    // Node
  public class Node { 
        private Object contentObj;
        private Node nextNode;

        public Node(Object pContent) { 
            contentObj = pContent;
            nextNode = null;
        }

        public void setContent(Object pContent) { 
            contentObj = pContent; 
        }

        public Object content() { 
            return contentObj; 
        }

        public void setNext(Node pNext) { 
            nextNode = pNext; 
        }

        public Node getNext() { 
            return nextNode; 
        }

    } // Ende der Klasse Node
 
    /**
     * Eine leere Liste wird erzeugt.
     */
    public List() {
        tail = new Node(null); // Dummy
        first = tail;
        tail.setNext(tail);
        /* Der next-Zeiger des hinteren Dummy-Elementes
         * zeigt auf das vorangehende Element.
         */
        current=first;
    }
  
    /**
     * Die Anfrage liefert den Wert true, wenn die Liste 
     * keine Objekte enthaelt, sonst liefert sie den Wert false.
     * @return true, wenn die Liste leer ist, sonst false
     */
    public boolean isEmpty() { 
        return first == tail; 
    }
 
    /**
     * Die Anfrage liefert den Wert true, wenn es ein
     * aktuelles Objekt gibt, sonst 
     * liefert sie den Wert false.
     * @return true, falls Zugriff moeglich, sonst false
     */
    public boolean hasAccess() { 
        return (!this.isEmpty()) && (current != tail);
    }
  
    /**
     * Falls die Liste nicht leer ist, es ein aktuelles 
     * Objekt gibt und dieses nicht das letzte Objekt der 
     * Liste ist, wird das dem aktuellen Objekt in der Liste 
     * folgende Objekt zum aktuellen Objekt, andernfalls gibt 
     * es nach Ausführung des Auftrags kein aktuelles Objekt, 
     * d.h. hasAccess() liefert den Wert false.
     */
    public void next() { 
        if (this.hasAccess())
            current = current.getNext();
    }
    
    public void previous() {
        Node lPos, lLast;
        lPos = current;
        lLast = current;
        this.toFirst();
        while (this.hasAccess() & !(current == lPos)) {
            lLast = current;
           this.next();
        }
        current=lLast;
    }
 
    /**
     * Falls die Liste nicht leer ist, wird das erste 
     * Objekt der Liste aktuelles Objekt. 
     * Ist die Liste leer, geschieht nichts.
     */
    public void toFirst() {
        if (!this.isEmpty())  
            current = first; 
    }
 
    /**
     * Falls die Liste nicht leer ist, wird das 
     * letzte Objekt der Liste aktuelles Objekt. 
     * Ist die Liste leer, geschieht nichts.
     */
    public void toLast() {
        if (!this.isEmpty())  
            current = tail.getNext(); 
    }

    /**
     * Falls es ein aktuelles Objekt gibt 
     * (hasAccess() == true), wird das aktuelle Objekt 
     * zurueckgegeben, andernfalls (hasAccess()== false) 
     * gibt die Anfrage den Wert null zurueck.
     * @return Inhaltsobjekt
     */
    public Object getObject() {   
        if (this.hasAccess())
            return current.content();
        else 
            return null;
    }
 
    /**
     * Falls es ein aktuelles Objekt gibt (hasAccess() == true)
     * und pObject ungleich null ist, wird das aktuelle Objekt 
     * durch pObject ersetzt. Sonst bleibt die Liste unveraendert.
     * @param pObject Inhaltsobjekt
     */
    public void setObject(Object pObject) { 
        if (pObject != null && this.hasAccess() )
            current.setContent(pObject); 
    }

    /**
     * Ein neues Objekt pObject wird am Ende der Liste eingefuegt. 
     * Das aktuelle Objekt bleibt unveraendert. Wenn die Liste 
     * leer ist, wird das Objekt pObject in die Liste eingefuegt 
     * und es gibt weiterhin kein aktuelles Objekt 
     * (hasAccess() == false). Falls pObject gleich null ist, 
     * bleibt die Liste unveraendert. 
     *@param pObject Inhaltsobject
     */    
    public void append(Object pObject) { 
        if (pObject != null) {  
            Node lNewNode,lPos0;
            lPos0 = current;
            lNewNode = new Node(pObject);
            lNewNode.setNext(tail);
            if (this.isEmpty())
                first = lNewNode;
            else {  
                Node lPrevious = tail.getNext();
                lPrevious.setNext(lNewNode);
            }  
            tail.setNext(lNewNode);
            current = lPos0;
        }
    }  

    /**
     * Fügt ein neues Objekt vor dem aktuellen Objekt ein
     */
    public void insert(Object pObject) {
        if (pObject != null) {
          Node lNewNode,lFront,lPos;
          if (this.isEmpty())
            this.append(pObject);
          else 
          if (this.hasAccess() ) {
            lPos = current;
            lNewNode = new Node(pObject);
            lNewNode.setNext(current);
            if (lPos == first )
              first = lNewNode;
            else {
              this.toFirst();
              lFront = current;
              while (this.hasAccess() & !(current == lPos)) {
                 lFront = current;
                 this.next();
              }
              lFront.setNext(lNewNode);
            }          
            current=lPos;
          }
        }
    }

    /**
     * Die Liste pList wird an die Liste angehaengt. Anschliessend 
     * wird pList eine leere Liste. Das aktuelle Objekt bleibt unveraendert. 
     * Falls pList null oder eine leere Liste ist, bleibt die Liste 
     * unveraendert.
     * @param pList Liste
     */
    public void concat(List pList) { 
        Node lCurrent1,lCurrent2,lPos0;
        if (pList != null && !pList.isEmpty() ) {
          if (this.isEmpty()  ) {
            first = pList.first;
            tail = pList.tail;
            current = tail;
          }
          else {
            lPos0 = current;  
            current = tail.getNext();
            lCurrent1 = current;
            pList.toFirst();
            current = pList.current;
            lCurrent2 = pList.current;
            lCurrent1.setNext(lCurrent2);
            if (lPos0 != tail)
                current = lPos0;
            else 
                current = pList.tail;
            tail = pList.tail;
            // pList wird zur leeren Liste
            pList.tail = new Node(null); // Dummy
            pList.first = pList.tail;
            pList.tail.setNext(tail);
            pList.current = pList.tail;
          }  
        }
    }  

    /**
     * Falls es ein aktuelles Objekt gibt (hasAccess() == true),
     * wird das aktuelle Objekt geloescht und das Objekt hinter 
     * dem gelaeschten Objekt wird zum aktuellen Objekt. Wird das 
     * Objekt, das am Ende der Liste steht, geloescht, gibt es kein 
     * aktuelles Objekt mehr (hasAccess() == false). Wenn die Liste 
     * leer ist oder es kein aktuelles Objekt gibt (hasAccess() == false),
     * bleibt die Liste unveraendert.
     */
    public void remove() { 
        Node lPos, lFront;
        if (this.hasAccess() ) {
            if (current == first ) {
                first = current.getNext();
                if (current.getNext() == tail)
                    tail.setNext(first);
                current = first;  
            }
            else {
                lPos = current;
                this.toFirst();
                lFront = current;
                while (this.hasAccess() & !(current == lPos)) {
                    lFront = current;
                    this.next();
                }
                lFront.setNext(lPos.getNext());
                current = lFront.getNext();
                if (current == tail)
                    tail.setNext(lFront);
            }  
        }
    }  
    
    
    /**
     * liefert die Länge der Liste als Integer Wert.
     * AKTUELLE POSITION WIRD AUF FIRST GESETZT!!!
     */
    public int getLaenge() {
        int counter = 0;
         this.toFirst();
         while(this.hasAccess()) {
             counter++;
             this.next();
         }
         this.toFirst();
        return counter;
        
    }
    
    public Node getPos() {
        return current;
    }
    
    public void setPos(Node pPosition) {
        current = pPosition;
    }
}

Fruits:
Java:
public class Fruits
{
    private String name;
    private int gewicht;
    
    public Fruits(String pName, int pGewicht)
    {
        name = pName;
        gewicht = pGewicht;
    }

    // Dienste
    
    public String getName()
    {
        return name;
    }
    
    public int getGewicht()
    {
        return gewicht;
    }

}

Die Anwendungsklasse (das mit den vielen Kommentaren ist die sortieren-Funktion):
Java:
public class Applet
{
    List schlange;
    
    public int counter;
    
    public Applet()
    {
        schlange = new List();
        this.einfuegen("Hagebutte", 30);
        this.einfuegen("Melone", 2000);
        this.einfuegen("Pflaume", 35);
        this.einfuegen("Banane", 130);
        this.einfuegen("Birne", 120);
        this.einfuegen("Erdbeere", 20);
        this.einfuegen("Pfirsich", 65);
        this.einfuegen("Apfel", 100);
        this.einfuegen("Himbeere", 5);
        this.einfuegen("Quitte", 50);
        this.einfuegen("Aprikose", 40);
        this.einfuegen("Kirsche", 10);
    }

    public void einfuegen(String pName, int pGewicht)
    {
        schlange.append(new Fruits(pName, pGewicht));
    }
    
    public void Get()
    {
        if(schlange.isEmpty() == true)
        {
            System.out.println("Die Liste ist leer");
        }
        else
        {
            schlange.toFirst();
            while (schlange.hasAccess())
            {
                Fruits object = (Fruits) schlange.getObject();
                System.out.println(object.getName() + " (Gewicht: " + object.getGewicht() + " )");
                schlange.next();
            }
        }
    }
    
    public void search(String pName)
    {
        schlange.toFirst();
        int count = 1;
        boolean found = false;
        while(schlange.hasAccess())
        {
            Fruits object = (Fruits) schlange.getObject();
            if(object.getName() == pName)
            {
                System.out.println(pName + " an Stelle " + count + " gefunden. Gewicht: " + object.getGewicht());
                found = true;
            }
            schlange.next();
            count++;
            
        }
        
        if(found == false)
        {
            System.out.println("Es wurde kein Obst mit diesem Namen gefunden");
        }
        
    }
    
    /**
     * sortiere die Objekte nach Namen via BubbleSort
     */
    public void nachNameSortieren()
    {
        Fruits object1;
        Fruits object2;
        String name;
        int zaehler = 0;
        int listeLaenge = (int) schlange.getLaenge();
        Node positionObject1;
        Node zwischenPos;
        schlange.toFirst();
        for(int i = 0; i < listeLaenge-1; i++)          //lässt die liste 12x durchsuchen (12 objekte in der liste)
        {
            object1 = (Fruits) schlange.getObject();    //nimmt sich im ersten durchlauf das erste objekt(Hagebutte) raus und vergleicht dies später mit den einzelnen anderen
            name = object1.getName();                   //                                                                                                      ^
            positionObject1 = schlange.getPos();        //merkt sich an welcher Position das objekt steht                                                       |
            for(int k = 0; k < listeLaenge-1-zaehler; k++)  //geht die liste einmal durch                                                                       |
            {                                               //                                                                                                  |
                schlange.next();                            //                                                                                                  |
                object2 = (Fruits) schlange.getObject();    //nimmt sich das zum Vergleich gewollte Objekt raus                                                 |
                if(schlange.hasAccess() == false) { System.out.println("NIXE OBJEKTE"); }       //Fehlerabfrage                                                 |
                if(name.compareTo(object2.getName()) > 0) //                                                                                                   |
                {                           //                                                                                                                  |
                    zwischenPos = schlange.getPos();        //}                                                                                                 |
                    schlange.setPos(positionObject1);       //}}                                                                                                |
                    schlange.remove();                      //}}}verschiebt object1 vor object2                                                                 |
                    schlange.setPos(zwischenPos);           //}}                                                                                                |
                    schlange.insert(object1);               //}                                                                                                 |
                    System.out.println("vgl. " + name + " mit " + object2.getName() + " (passt)" );             //                                              |
                }                           //                                                                                                                  |
                else                        //                                                                                                                  |
                {                           //                                                                                                                  |
                    System.out.println("vgl. " + name + " mit " + object2.getName() + " (passt nicht)" );      //auch nur Fehlerabfrage                         |
                }                           //                                                                                                                  |
            }                               //                                                                                                                  |
            schlange.toFirst();             //die Liste muss natürlich immer wieder von vorne durchgegangen werden                                              |
            for(int m = 0; m < i+1; m++)    //                                                                                                                  |
            {                               //                                                                                                                  |
                schlange.next();            //nein, nicht von vorne, sondern von der Position nach dem object1(oben wird wieder ein neues rausgenommen ----------
            }
            zaehler++;
        }
    }

}

Danke für eure Mühen:)
DFPWare
 
G

Gast2

Gast
Die Klasse Node solltest du über
Code:
List.Node
ansprechen können.
 

Oben