Problem z LinkedList

0

Witam serdecznie. Chcialem skorzystac z listy wiazanej ze standardowej biblioteki javy i oto co mnie zaszokowalo/czego nie rozumiem: tworze nowa liste wiazana, wpisuje do niej losowe wartosci i przekazuje ja do obiektu klasy FCFS, ktory ją sobie po swojemu przetwarza (przy okazji zdejmujac elementy z listy - lista dziala na zasadzie kolejki. pod koniec dzialania funkcji jest pusta). Po opuszczeniu obiektu fcfs chce przekazac ta sama liste obiektowi sstf, bedac przekonanym ze jest niezmieniona. Jednak lista jest pusta - wychodzi na to obiekt fcfs zmienil glowna liste, chociaz nie powinien, przeciez gdy przekazujemy obiekty jako parametry to tworzone sa kopie tych obiektow. Co sie w takim razie dzieje?

package sth; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.Random; 

public class Main { 
        public static void main(String[] args){ 
                int ilCyl = 150; 
                int ilZgl = 3; 
                int start = 19; 
                final LinkedList<Integer> q = new LinkedList<Integer>(); 
                
                Random r = new Random(); 
                for(int i = 0; i<ilZgl; i++){ 
                        int liczba = r.nextInt(ilCyl) + 1; 
                        q.offer(liczba);        
                        System.out.print(liczba + ", "); 
                } 
                FCFS fcfs = new FCFS(q, start); 
                int fcfsLicznik = fcfs.work(); 
                
                SSTF sstf = new SSTF(q, start); 
                sstf.work(); 
                
        } 
}
0

przeciez gdy przekazujemy obiekty jako parametry to tworzone sa kopie tych obiektów

Gdzie to wyczytałeś?

0

Nie pamietam. Oczywiscie argumentem konstruktora/funkcji moze byc wskaźnik (tak przynajmniej jest w C++) i wtedy operujemy na oryginalnym obiekcie. Ale tutaj - zdaje mi sie - tak nie jest. Zmienna "start" jakos nie jest zmieniana, jej wartość w Klasie Main jest caly czas taka sama, mimo ze jest przekazana do obiektu fcfs, gdzie jest modyfikowana.

0

kopie to będziesz mieć tylko dla typów prymitywnych (stąd zmienna start ma inną wartość). dla wszystkich pozostałych obiektów będziesz mieć referencje.
może nie są to absolutne podstawy, ale bez takiej wiedzy daleko nie zajdziesz.

a robienie kopii obiektu (szczególnie głębokiej) to nie taka trywialna sprawa, jak mogłoby Ci się wydawać.

0

To wiele wyjaśnia. Co zatem moge z tym zrobic?

0

Najprościej, to stworzyć druga listę

                final LinkedList<Integer> q = new LinkedList<Integer>(); 
                LinkedList<Integer> kopia = new LinkedList<Integer>();
                Random r = new Random(); 
                for(int i = 0; i<ilZgl; i++){ 
                        int liczba = r.nextInt(ilCyl) + 1; 
                        q.offer(liczba);
                        kopia.offer(liczba);        
                        System.out.print(liczba + ", "); 
                } 
0

wykorzystałem metode clone(). dzieki za pomoc! pozdrawiam

0

Z dokumentacji LinkedList:

Returns a shallow copy of this LinkedList. (The elements themselves are not cloned.)

Integer jest niemutowalny, więc nie możesz zmienić obiektu wskazywanego przez referencję, ale możesz zawsze zmienić referencję. Dlatego shallow copy w przypadku Listy Integerów, zachowuje się tak jak deep copy. Problem będzie, gdy zrobisz listę mutowalnych obiektów, czyli np takich z setterami czy ogólnie metodami do zmiany stanu.

0

I co wtedy?

0

Wtedy zrobisz kopię moim sposobem.

Zależy co chcesz uzyskać. LinkedList<SomeClass> lista1 oraz LinkedList<SomeClass> lista2. Na każdej pozycji tych list ma być ten sam obiekt, czy różne obiekty o identycznym (przynajmniej początkowo) stanie? W drugim przypadku będzie zapewne potrzebny konstruktor kopiujący w klasie SomeClass.

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