Ręczna metoda dodająca dwie tablice podwójnie wiązane - coś poszło nie tak...

0

Hej!
Napisałem sobie taką reczną listę i chcę napisać coś na styl addAll() z biblioteki. Program się kompiluje, ale zamiast pokazać pierwszą listę, potem drugą i na koncu wynik dodania. Mam pierwszą i 2 razy drugą. Gdzie popełniłem błąd w logice? Kombinuję tym w różne strony i zawsze coś nie działa :/ PS. To "implement List" odnosi się do mojego własnego surowego interfejsu

 
public class Lista implements List {
    private Element head = new Element(null); //wartownik
    private int size; 
    public Lista(){
        clear();
    }
    
    public void addAll(Lista lista2) {
      Element lista1tail = getElement(size());
        lista1tail.next = lista2.head.next;
        lista2.head.previous = lista1tail;
        head.previous = lista2.getElement(lista2.size());
            size = size+lista2.size();
    }
    
   /* public void printList() {
    { Element current = head; 
    while(current!=null) { 
        System.out.println(current.value);
    }
    current = current.next;}
    }*/
    
    public void clear(){
        head.setPrevious(head);
        head.setNext(head);
        size=0;
    }
   
   public void insert(int index, Object value) throws IndexOutOfBoundsException {
       if (index<0 || index>size) throw new IndexOutOfBoundsException();
       Element element = new Element(value);
       element.wstawPrzed(getElement(index));
       ++size;
   }
   
  public Element getElement(int index) {
       Element szukany = head;
       for (int i=index; i>0; --i) 
           szukany = szukany.getNext();   
       return szukany;
   }
   
    
     public Object get(int index) throws IndexOutOfBoundsException{
        if(index<0 || index>size) throw new IndexOutOfBoundsException();
        Element particular = head.getNext();
        for(int i=0; i <= index; i++)
            particular = particular.getNext();
        return particular.getValue();
    }  
    
    public boolean delete(Object o){
        if(head.getNext() == null) return false;
        if(head.getNext().getValue().equals(o)){
            head.setNext(head.getNext().getNext());
            size--;
            return true;
        }
 
        Element delete = head.getNext();
        while(delete != null && delete.getNext() != null){
            if(delete.getNext().getValue().equals(o)){
                delete.setNext(delete.getNext().getNext());
                                size--;
                return true;
            }
            delete = delete.getNext();
        }
        return false;
    }
   
    public int size(){
        return size;
    }
    
    public boolean isEmpty(){
        return size == 0;
    }
    
   public void infoOStanie() {
        if (isEmpty()) {
          System.out.println("Lista pusta.");
      }
      else
      {
          System.out.println("Lista zawiera " + size() + " elementow.");
      }
    
    }
    
    public IteratorListowy iterator() {
        return new IteratorListowy();
    }
    
    public void wyswietlListe() {
        System.out.println();
        IteratorListowy iterator = iterator();
        for (iterator.first(); !iterator.isDone(); iterator.next())
        {
            System.out.println(iterator.current());
        }
        System.out.println();
    }
  
    private static final class Element{
        private Object value; 
        private Element next; //Referencja do kolejnego obiektu
        private Element previous; //Referencja do elementu poprzedniego
        
        public Element(Object value){ 
            setValue(value); 
          }
        
        public void setValue(Object value) {
            this.value = value;
        }
        
        public Object getValue() {
            return value;
        }
        
        //ustawia referencję this.next na obiekt next podany w atgumencie
        public void setNext(Element next) {
            if (next != null)
            this.next = next;
        }
      
        public Element getNext(){
            return next;
        }
        
        public void setPrevious(Element previous) {
            if (previous != null)
            this.previous = previous;
        }
        
        public Element getPrevious() {
            return previous;
        }
        
        public void wstawPrzed(Element next) {
            Element previous = next.getPrevious();
            setNext(next);
            setPrevious(previous);
            next.setPrevious(this);
            previous.setNext(this);
        } 
        
        public void delete() {
            previous.setNext(next);
            next.setPrevious(previous);
        }
      
    }
    
    private class IteratorListowy implements Iterator{
    private Element current;
    
   public IteratorListowy() {
       current = head;
   } 
    
   public void next() {
       current = current.next;
   }   
   
   public void previous() {
       current = current.previous;
   }
   
   public boolean isDone() {
       return current == head;
   } 
    public Object current() {
       return current.value;
   }
    
   public void first() {
       current = head.getNext();
   }
   
   public void last() {
       current = head.getPrevious();
   }
}
}
 
public class Program {

    public static void main(String[] args) {
      Lista lista1 = new Lista();
      Lista lista2 = new Lista();
      Student s1 = new Student("Kowalski", 3523);
      Student s2 = new Student("Polański", 45612);
      Student s3 = new Student("Karzeł", 8795);
      Student s4 = new Student("Pałka", 3218);
      Student s5 = new Student("Konowałek", 8432);
      Student s6 = new Student("Kłopotek", 6743);
      Student s7 = new Student("Całka", 14124);
      Student s8 = new Student("Pabin", 1258);
      Student s9 = new Student("Dryjas", 7896);
      Student s10 = new Student("Zając", 5642);
      lista1.insert(0, s1);
      lista1.insert(0, s2);
      lista1.insert(0, s3);
      lista1.insert(0, s4);
      lista1.insert(0, s5);
      lista1.wyswietlListe();
      lista1.infoOStanie();
      
      lista2.insert(0, s6);
      lista2.insert(0, s7);
      lista2.insert(0, s8);
      lista2.insert(0, s9);
      lista2.insert(0, s10);
      lista2.wyswietlListe();
      lista2.infoOStanie();
      
      lista1.addAll(lista2);
      
      lista2.wyswietlListe();
      
    }
   
}
0

Chyba wywodzisz się z PASCALA i masz wrodzone skłonności SadoMaso

0

Pomyślałeś o tym, że modyfikowana ma być wyłącznie lista this? Przede wszystkim nie wolno Ci przypisywać jakiejkolwiek wartości związanej z argumentem, a ty to robisz w lista2.head.previous = lista1tail;. Zmieniasz więc tę listę, której elementy dodajesz.
Krótko mowiąc iterator nie jest iteratorem, a metoda addAll nie robi tego co sugeruje jej nazwa czyli dodaje do listy kolejne elementy będące kopiami oryginalnych elementów, a po prostu skleja dwie listy.
Jeszcze dochodzi sprawa nazewnictwa. Listy standardowe nie bez powodu trzymają węzły, a nie docelowe elementy. Węzły (u ciebie nazywają się one Element) są prywatną własnością listy, która je posiada, nie może ich sobie wziąć z innej listy, ani pożyczyć innej swoich węzłów. Może stworzyć nowe, prywatne na bazie innych, ale nie może tymi innymi rozporządzać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1