addLast und addFirst bei Listen

FunkyPhil94

Mitglied
Hallo zusammen,

sitze an einer Frage/einem Problem fest.

Es soll eine Klasse "SchlangeMitEVL" erstellt werden, die im Prinzip eine Schlange mit einer einfach verketteten Liste ist.

Beim JUnit test, kommen allerdings Fehler auf, die ich nicht verstehe, bzw. warum diese entstehen..

SchlangeMitEVL hat folgende 3 Methoden, die mir etwas Sorgen bereiten:

Java:
    @Override
    public void insert(T value) throws IllegalStateException {
        evl.addLast(value);
    }

    @Override
    public T remove() throws NoSuchElementException {
        if (isEmpty()) {
            throw new NoSuchElementException("Schlange ist leer");
        }
        T removed = evl.removeFirst();
        if (removed == null) {
            throw new NoSuchElementException("Element konnte nicht entfernt werden");
        }
        return removed;
    }

    @Override
    public T front() throws NoSuchElementException {
        if (isEmpty()) {
            throw new NoSuchElementException("Schlange ist leer");
        }
        return evl.getFirst();
    }

bei Insert wird das addLast von EVL aufgerufen, damit der Wert "von hinten" in die Liste geschoben wird. Wie bei einer Warteschlange.

Hier der wichtige Code von EVL:

Java:
    public T removeFirst(){
        if(null != first) {
            T r = first.data;
            first = first.next;
            size--;
            return r;
            }
        return null;
    }
    
    public T getFirst()throws NoSuchElementException{
        if(first == null) {
            throw new NoSuchElementException("Get First: Liste ist leer");
            }
        return first.data;
    }
    
    public void addLast(T o){
        ListenEl e = new ListenEl(o);
        if (first == null) {
            first = e;
        } else {
            ListenEl current = first;
            while (current.next != null) {
                current = current.next;
            }
            current.next = e;
        }
        size ++;
    }

Im dazugehörigen JUnit test sind nun folgende Fehler:


Code:
  public void testInsertAndremove() {
    SchlangeMitEVL<Integer> schlange = new SchlangeMitEVL<>();
    schlange.insert(1);
    schlange.insert(2);
    assertEquals(1, (int) schlange.remove());
    assertEquals(2, (int) schlange.remove());
    assertTrue(schlange.isEmpty());
  }
 
    public void testFront() {
      SchlangeMitEVL<String> schlange = new SchlangeMitEVL<>();
      assertTrue(schlange.isEmpty());
      schlange.insert("A");
      schlange.insert("B");
      assertEquals("A", schlange.front());
      assertEquals("B", schlange.front());
  }


Bei testInsertAndRemove ist der Fehler im 1. assertEquals "NoSuchElementException:Element konnte nicht entfernt werden".
Aber warum? removeFirst von EVL sollte doch dann die 1 removen oder?

Bei testFront ist der Fehler ebenfalls im 1. assertEquals "NoSuchElementException: Get First: Liste ist leer".
Die Liste sollte doch in etwa so aussehen <A,B> bzw.


Bedeutet das, wenn man einer Liste ein Element von hinten anfügt, dass das "erste" Element den Wert "null" hat?
 

KonradN

Super-Moderator
Mitarbeiter
Also so auf den ersten Blick sieht der Code soweit ok aus .. wie ist isEmpty implementiert? Bei so Fragen bitte immer den ganzen Code posten!
 

FunkyPhil94

Mitglied
Alles klar, einmal den kompletten Code:

Java:
import java.util.NoSuchElementException;

class EVL <T>{
    
        ListenEl first = null;
        int size = 0;    //Laenge
        
        class ListenEl{
            T data;        //Inhalt
            ListenEl next;
            
            ListenEl(T o) {
                data = o;
                next = null;
            }
        }
    
    public void addFirst(T o) {
        ListenEl e = new ListenEl(o);
            if(first == null) {
                first = e;
            } else {
                e.next = first;
                first = e;
            }
        size++;
    }
    
    public T removeFirst(){
        if(null != first) {
            T r = first.data;
            first = first.next;
            size--;
            return r;
            }
        return null;
    }

    
    ////////////////////////////////
    
    public T getFirst()throws NoSuchElementException{
        if(first == null) {
            throw new NoSuchElementException("Get First: Liste ist leer");
            }
        return first.data;
        }
    
    public T getLast()throws NoSuchElementException{
        if(first == null) {
            throw new NoSuchElementException("Get Last: Liste ist leer");
            }
        ListenEl e = first;
        while (e.next != null) {
            e = e.next;
        }
        return e.data;
    }
    
    public void addLast(T o){
        ListenEl e = new ListenEl(o);
        if (first == null) {
            first = e;
        } else {
            ListenEl current = first;
            while (current.next != null) {
                current = current.next;
            }
            current.next = e;
        }
        size ++;
    }
    
    public T removeLast()throws NoSuchElementException{
        if (first == null) {
            throw new NoSuchElementException("Remove Last: Liste ist leer");
        }
        if(first != null && first.next == null) {
            T r = first.data;
            first = null;
            size--;
            return r;
            }
        ListenEl current = first;
        while (current.next.next != null) {
            current = current.next;
        }
        T r = current.next.data;
        current.next = null;
        size --;
        return r;
    }
    
    public boolean contains(T o){
        while (first != null) {
            if (first.data.equals(o)) {
                return true;
            }
            first = first.next;
        }
        return false;
    }
    
    
    public int size(){
        int s = 0;
        if(first == null) { 
            return s;
        }
        while (first != null) {
            s++;
            first = first.next;
        }
        return s;
        
    }
    
    public String toString(){
        String s = "";
        if(first == null) {
            return "Leer";
        }
        while (first != null) {
            s += first.data + "-";
            first = first.next;
            }
        s = s.substring(0,s.length()-1);
        return "(" + s + ")";
    }
    
    
}



Code:
import java.util.NoSuchElementException;

public class SchlangeMitEVL<T> implements Schlange<T> {
    private EVL<T> evl;

    public SchlangeMitEVL() {
        evl = new EVL<>();
    }

    @Override
    public boolean isEmpty() {
        return evl.size() == 0;
    }


    @Override
    public int size() {
        return evl.size();
    }

    @Override
    public int capacity() {
        return Integer.MAX_VALUE;
    }

    @Override
    public void insert(T value) throws IllegalStateException {
        evl.addLast(value);
    }

    @Override
    public T remove() throws NoSuchElementException {
        if (isEmpty()) {
            throw new NoSuchElementException("Schlange ist leer");
        }
        T removed = evl.removeFirst();
        if (removed == null) {
            throw new NoSuchElementException("Element konnte nicht entfernt werden");
        }
        return removed;
    }

    @Override
    public T front() throws NoSuchElementException {
        if (isEmpty()) {
            throw new NoSuchElementException("Schlange ist leer");
        }
        return evl.getFirst();
    }
}


Code:
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.NoSuchElementException;

public class SchlangeMitEVLTest2 {
 
    
    
    
  @Test
  public void testIsEmpty() {
    SchlangeMitEVL<String> schlange = new SchlangeMitEVL<>();
    assertTrue(schlange.isEmpty());
    schlange.insert("A");
    assertFalse(schlange.isEmpty());
  }
 
  @Test
  public void testInsertAndremove() {
    SchlangeMitEVL<Integer> schlange = new SchlangeMitEVL<>();
    schlange.insert(1);
    schlange.insert(2);
    assertEquals(1, (int) schlange.remove());
    assertEquals(2, (int) schlange.remove());
    assertTrue(schlange.isEmpty());
  }
 
 @Test
  public void testFront() {
      SchlangeMitEVL<String> schlange = new SchlangeMitEVL<>();
      assertTrue(schlange.isEmpty());
      schlange.insert("A");
      schlange.insert("B");
      assertEquals("A", schlange.front());
      assertEquals("B", schlange.front());
  }

 
  @Test(expected = NoSuchElementException.class)
  public void testremoveWithEmptyQueue() {
    SchlangeMitEVL<Double> schlange = new SchlangeMitEVL<>();
    schlange.remove();
  }
 
  @Test(expected = NoSuchElementException.class)
  public void testFrontWithEmptyQueue() {
    SchlangeMitEVL<Object> schlange = new SchlangeMitEVL<>();
    schlange.front();
  }
 
  @Test
  public void testSize() {
    SchlangeMitEVL<Integer> schlange = new SchlangeMitEVL<>();
    assertEquals(0, schlange.size());
    schlange.insert(1);
    schlange.insert(2);
    assertEquals(2, schlange.size());
    assertEquals(0, schlange.size());
  }
 
  @Test
  public void testCapacity() {
    SchlangeMitEVL<String> schlange = new SchlangeMitEVL<>();
    assertEquals(Integer.MAX_VALUE, schlange.capacity());
  }
 
}
 

KonradN

Super-Moderator
Mitarbeiter
Ach je ... so manche Fehler sind wirklich nett :)

toString soll lediglich einen String aufbauen ... und nichts verändern:
Java:
    public String toString(){
        String s = "";
        if(first == null) {
            return "Leer";
        }
        while (first != null) {
            s += first.data + "-";
            first = first.next;
        }
        s = s.substring(0,s.length()-1);
        return "(" + s + ")";
    }

Wird in der Methode irgend etwas verändert?

Ebenso die Methode size: Verändert die etwas?
Java:
    public int size(){
        int s = 0;
        if(first == null) {
            return s;
        }
        while (first != null) {
            s++;
            first = first.next;
        }
        return s;
    }

Wenn Du es nicht sofort siehst: Schau Dir einmal an, wie Du in removeLast vorgehst!

contains hat den Fehler ansonsten auch noch ...

Und ganz am Rand: Du pflegst ja die Variable size - Wenn Du das machst (mit size++ und size--), dann brauchst Du natürlich in size() nichts mehr berechnen....
 

KonradN

Super-Moderator
Mitarbeiter
Ach ja - die Unit Tests laufen noch nicht, wenn Du das angepasst hast:

  • in testFront kommt ein Fehler - da musst Du einmal überlegen, was denn front() macht. Und zwei mal hintereinander front aufrufen: was gibt das zurück.
  • in testSize: Da kommt ein Fehler: Du prüfst die size - und dann soll beim zweiten Aufruf eine andere size sein?
 

FunkyPhil94

Mitglied
Also deine Antwort und Hilfe machen Sinn. Eine "Kopie" der Liste zu erstellen klingt nicht dumm.
Ich hoffe darauf wolltest du hinaus :)

Zu dem "witzigen" 2. , anderen Wert bei testSize: Das war zum Testen gedacht, da mir dort immer 0 ausgegeben wurde.

Habe die Codes nun korrigiert und es funktioniert (ListenEl current = first).
Wie auch schon in removeLast gemacht.

Aber liegt es wirklich daran?
Denn wenn ich ähnliches mit Arrays bzw. Arrays mache, passieren solche Fehler (eigentlich) nicht.

Aber nochmals Danke bis hierher :)
 

KonradN

Super-Moderator
Mitarbeiter
Von den Begriffen her: Du machst keine Kopie der Liste aber Du nutzt eine lokale Variable um auf das aktuelle Element zu verweisen beim Durchgehen.

Aber liegt es wirklich daran?
Ja, daran lag es. Beim Aufruf von isEmpty wurde size aufgerufen. Da kam dann noch z.B. 2 korrekt raus, aber first war danach null.
Beim Versuch, dann auf das erste Element zuzugreifen, gab es das natürlich nicht mehr.

Wenn das bei der Speicherung in Arrays nicht passierte, dann war schlicht kein solcher Fehler in dem Code.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
D Listen in Listen in Listen ... ??? Java Basics - Anfänger-Themen 2
XWing listen Java Basics - Anfänger-Themen 7
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
Buroto Threads Verschiedene .txt Dateien Auf Listen und Verbinden Java Basics - Anfänger-Themen 3
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
S Lineare listen verkettung Java Basics - Anfänger-Themen 7
S Listen Java Basics - Anfänger-Themen 12
S Listen , Nodes am ende anängen Java Basics - Anfänger-Themen 6
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
M Java Listen Java Basics - Anfänger-Themen 4
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
A PhoneBook mit verketteten listen Java Basics - Anfänger-Themen 48
F ich brauche Hilfe bei Listen Java Basics - Anfänger-Themen 13
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
G Java Listen und Iterator Java Basics - Anfänger-Themen 2
S Erklaerung Listen Java Basics - Anfänger-Themen 27
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
L Skip Listen Java Basics - Anfänger-Themen 5
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
L Wie testet man (selbstgeschriebene) Listen sinnvoll? Java Basics - Anfänger-Themen 2
F Problem mit Listen Java Basics - Anfänger-Themen 5
J Listen Operationen Java Basics - Anfänger-Themen 4
O Unterschied Arrays, Listen, Mengen Java Basics - Anfänger-Themen 24
J Eine Liste von Listen erstellen Java Basics - Anfänger-Themen 11
A Sortierte Listen Java Basics - Anfänger-Themen 4
L Datenstrukturen/ Listen Java Basics - Anfänger-Themen 17
A Was könnten typische Prüfungsaufgaben zum Thema lineare, verkettete Listen sein? Java Basics - Anfänger-Themen 5
L Listen und Felder Java Basics - Anfänger-Themen 2
M Fragen zum Anlegen und Benutzen von Listen Java Basics - Anfänger-Themen 9
R Arrays und Listen Java Basics - Anfänger-Themen 1
R Listen richtig implementieren Java Basics - Anfänger-Themen 3
F Multidimensionale Listen Java Basics - Anfänger-Themen 3
F Wie String in unterschiedliche Listen teilen Java Basics - Anfänger-Themen 7
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
T Objekte in Listen vererben Java Basics - Anfänger-Themen 3
A Klassen Klassen und Listen... Java Basics - Anfänger-Themen 5
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
S Methoden Vergleichen von zwei Listen in der Geschwindigkeit von O(n+m) Java Basics - Anfänger-Themen 32
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
C Listen Java Basics - Anfänger-Themen 3
C Zwei Listen verbinden Java Basics - Anfänger-Themen 1
C Zahlen merken mit Hilfe von Arrays/Listen Java Basics - Anfänger-Themen 2
E Feld von verketteten Listen Java Basics - Anfänger-Themen 11
T Überprüfung einer Aufgabe zu verketteten Listen Java Basics - Anfänger-Themen 5
S Liste mit Objekten und Listen Java Basics - Anfänger-Themen 9
JarJarBigs Frage zu Listen Java Basics - Anfänger-Themen 2
N verkettete Listen Java Basics - Anfänger-Themen 4
O Listen sort-Methode Java Basics - Anfänger-Themen 1
I Listen sortieren bei mehreren Listen zu einer Java Basics - Anfänger-Themen 2
L Lineare Listen Java Basics - Anfänger-Themen 2
S Listen Objekte nach LocalDateTime sortieren Java Basics - Anfänger-Themen 2
D Methoden Listen generieren Java Basics - Anfänger-Themen 4
A Sichtbarkeit in Methoden/Listen Java Basics - Anfänger-Themen 3
M verkettete Listen Java Basics - Anfänger-Themen 1
D Klausur Vorbereitung: Listen, Rekursion, Bäume & Vererbung Java Basics - Anfänger-Themen 3
S Vergleich von Listen Java Basics - Anfänger-Themen 6
I Zwei Listen vergleichen Java Basics - Anfänger-Themen 2
M Listen erstellen mit unterschiedlichen Reihenfolgen Java Basics - Anfänger-Themen 3
I Zwei Listen vergleichen bei n:m Beziehung Java Basics - Anfänger-Themen 2
I Zwei Listen: Wenn nicht vorhanden löschen Java Basics - Anfänger-Themen 4
I Prüfen von zwei Listen Java Basics - Anfänger-Themen 1
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
L Best Practice Alle Kombinationen aus Listenelementen, Anzahl Listen unterschiedlich Java Basics - Anfänger-Themen 6
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
S Unsortierte Listen - Frage zur "Verkettung" Java Basics - Anfänger-Themen 1
I Zwei Listen vergleichen Java Basics - Anfänger-Themen 7
I Listen, for - Schleifen Java Basics - Anfänger-Themen 8
P Listen Size stimmt nicht Java Basics - Anfänger-Themen 5
O Objekt Listen serialisierung und deserialisieren Java Basics - Anfänger-Themen 5
L Collections Objekte in Listen speichern Java Basics - Anfänger-Themen 3
G 2 Listen kombinieren und nach abc sortieren Java Basics - Anfänger-Themen 9
D Annonyme Innere Klasse: Listen mit geradem Index ausgeben Java Basics - Anfänger-Themen 6
G Listen sortieren Java Basics - Anfänger-Themen 3
G Generic und Listen Java Basics - Anfänger-Themen 8
R SQL ähnlicher Filter für Java Listen Java Basics - Anfänger-Themen 2
Y Collections 4 Listen Java Basics - Anfänger-Themen 14
S OOP/ Listen...etc... Java Basics - Anfänger-Themen 14
E Listen Java Basics - Anfänger-Themen 2
V Methoden Verkettete Listen Index eines Elementes ausgeben Java Basics - Anfänger-Themen 10
B Listen Java Basics - Anfänger-Themen 3
B eigene klasse in listen eintragen Java Basics - Anfänger-Themen 6
B Map per Listen Java Basics - Anfänger-Themen 2
S Erfahrungswerte von schnelles durchlaufen von Listen mit 2 Werten Java Basics - Anfänger-Themen 10
Joew0815 Problem mit Listen: add() Java Basics - Anfänger-Themen 11
P Zeichenorientierte & Serialisierte Datenverarbeitung Listen Java Basics - Anfänger-Themen 8
E Listen und Generics Java Basics - Anfänger-Themen 9
L dynamisches erzeugen von array Listen Java Basics - Anfänger-Themen 7
E Listen und Duplikate Java Basics - Anfänger-Themen 2
R Hilfe bei Listen Java Basics - Anfänger-Themen 10
F Collections Liste von Listen Java Basics - Anfänger-Themen 21
A Methoden Anfängerfrage: 2 Listen Vergleichen Java Basics - Anfänger-Themen 7
walker23m C++ Listen iteratoren in Java umwandeln Java Basics - Anfänger-Themen 3
X Listen und verschiedene Methoden Java Basics - Anfänger-Themen 6
N Listen Java Basics - Anfänger-Themen 5
S Listen Klasse selbst schreiben Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben