einfach verkettete Liste

RJN

Mitglied
Ich möchte eine Node an der letzte Stelle an meiner link list hinzufügen. Davor sollte ich überprüfen, ob diese Ticket schon vorhanden ist. In der Ticket- und Node-Klasse sind nur Getters und Setters. Mein Problem ist, dass ich die Überprüfung nicht sehr toll hinkriege.
Java:
public class Node {
    
    private Ticket value;
    private Node next;
    
    public Node(Ticket value, Node next)
    {
        setValue(value);
        setNext(next);
    }

    public Ticket getValue() {
        return value;
    }

    public void setValue(Ticket value) {
        this.value = value;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}
public class Verwaltung
{
    private Node head;
    private Node tail;

    public boolean addTicket(Ticket t)
    {
        if (t == null)
        {
            return false;
        }
        if (head == null)
        {
            head = new Node(t, null);
            return true;
        }   
        else
        {
            tail = head;
        }
        System.out.println(tail.getValue()); //Tail-Wert vorher
        while (tail != null)
        {
            if (tail.getValue() == t)
            {
                return false;
            }
            if (tail.getNext() != null)
            {
                tail = tail.getNext();
            }
            else
            {
                tail = new Node(t, head);
                break;
            }                                   
        }
        System.out.println(tail.getValue()); //Tail-Wert nachher
        return true;
    }
}
Mit dieser Test-Klasse teste ich meine Methode
Java:
public static void main(String[] args) {
        // TODO Auto-generated method stub
        Support s = new Support();
        Ticket t1 = new Ticket("ProblemA", "KundeA", 40, true);
        Ticket t2 = new Ticket("ProblemB", "KundeB", 40, true);
        Ticket t3 = new Ticket("ProblemC", "KundeC", 40, true);
        Ticket t4 = new Ticket("ProblemD", "KundeD", 40, true);
        Ticket t5 = new Ticket("ProblemE", "KundeE", 40, false);
        
        System.out.println("---------------Test1---------------");
        System.out.println();
        System.out.println(s.addTicket(t1)); //true
        System.out.println(s.addTicket(t2)); //true
        System.out.println(s.addTicket(t3)); //true
        System.out.println(s.addTicket(t4)); //true
        System.out.println(s.addTicket(t2)); //da sollte false rauskommen
        System.out.println(s.addTicket(t5)); //true
        
        System.out.println("---------------Test2---------------");
        System.out.println(s.addTicket(t1)); //true
        System.out.println(s.addTicket(t2)); //true
        System.out.println(s.addTicket(t3)); //true
        System.out.println(s.addTicket(t4)); //true
        System.out.println(s.addTicket(t1)); //da kommt komischerweise true
        System.out.println(s.addTicket(t5)); //true
    }
 
Mein Problem ist, dass ich die Überprüfung nicht sehr toll hinkriege.
Da wäre meine Frage, was Du mit "nicht sehr toll hinkriegen" meinst. Was genau würdest Du gerne verändern?

Dann sind zwei Dinge falsch:

a) Einfügen am Ende der Liste ist falsch. Wie kommst Du auf:
Java:
tail = new Node(t, head);
Bei sowas gilt eigentlich immer:
Visualisiere es! Bei Listen bietet es sich an, das einfach mit Stift und Papier aufzumalen. Was ist der Zustand, und wie kommst Du da dann weiter?

b) Generell muss ich sagen, dass die Prüfung bei Dir falsch ist. Die funktioniert bei nur deshalb in Deinen Tests, da Du immer mit den gleichen einmal erzeugten Tickets arbeitest.

Wenn Du aber prüfst:
Java:
Ticket t1 = new Ticket("ProblemA", "KundeA", 40, true);
Ticket t1Copy = new Ticket("ProblemA", "KundeA", 40, true);
dann würden das für Dich zwei unterschiedliche Tickets sein.

==> Instanzen bitte per equals prüfen und nicht per ==. Und dann sollte Ticket natürlich auch equals überschreiben, so dass die Tickets als gleich erkannt werden können.


Ganz wichtig: Erläutere uns erst einmal was in der Liste head und tail sind! Vermutlich machst Du da richtigen Bockmist (Nicht pers. nehmen - das macht jeder mal. Und am Anfang ist es normal, dass sowas vorkommt) oder vielleicht ist da auch einfach nur eine lokale Variable aus Ihrem Geltungsbereich "entkommen" und das spielt einfach keine Rolle 🙂
 

Zurück
Oben