• Never  
    Wydział: W-8 IZ
    Rok studiów: 2

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Witka! Miałbym prośbę odnośnie listy zadań numer 4 u U. Staszak , trzeba napisać listę jednokierunkowa która za elementy będzie miała karty do gry. Problem mój odnosi się do dodawania elementów tej listy, jest to o tyle dziwne ze nigdy nie wiadomo co się stanie- raz wyskoczy mi NullPointerException, raz pętla się zapętli a raz nic się nie stanie(element nie zostanie dodany ale program zakończy działanie) Oto fragmenty kodu, które napisałem:

    Kod:
        public void insert(int index, Karta value){
            if(index>=0 && index<_size){
                Element temp= getElement(index);
                getElement(index).setValue(value);
                getElement(index).setNext(temp);
                ++_size;
            }
            else if(index==_size){
                Element temp= new Element(value);
                getElement(_size-1).setNext(temp);
                ++_size;
            }
        }
        public void dodaj(Karta value){
            int miejsce=0;
            if(pierwszy.getNext()==null){
                insert(0,value);
            }
            else{
                Element p1=pierwszy.getNext();
                while(p1.getValue()!=null && p1.getValue().getWartosc()<value.getWartosc()){
                    p1=p1.getNext();
                    miejsce++;
                }
                insert(miejsce, value);
            }
        }


    Zapomniałem napisać ze dodawanie ma się odbywać w sposób uporządkowany wg wartości kart... (funkcja odpowiedzialna: dodaj())

    A to jest kod klasy Element:
    Kod:
        private static final class Element {
            private Karta _value;
            private Element _next;

            public Element(Karta value)
            { setValue(value); }

            public void setValue(Karta value)
            { _value = value;  }

            public Karta getValue()
            { return _value;   }

            public Element getNext()
            { return _next; }

            public void setNext(Element next)
            { _next = next; }

            public void detach(Element e) {
                e.setValue(e.getNext().getValue());
                e.setNext(e.getNext().getNext());
            }
        }   

    I teraz prośba- jak ktoś mógłby mi wytłumaczyć gdzie popełniam błąd, zaproponować jakieś poprawki albo podzielić się działającym fragmentem kodu, który realizowałby wyżej wymienione funkcje, to będę bardzo wdzięczny :wink:
    d41d8cd98f00b204e9800998ecf8427e
  • ateemka  
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • u Pani Staszak nie ma się co aż tak bardzo wysilac w indeksy itp ;) btw. coś mi się kojarzy, że to co jest wyżej to dzieło Rataja;)

    Kod:
     public void dodaj(Karta k)
        {
            if(jestPusta() || !pierwszy.dane.mniejszaOd(k))
                dodajPierwszy(k);
            else
            {
                Wezel wezel = pierwszy;
                while(wezel.nast!= null && wezel.nast.dane.mniejszaOd(k))
                {
                    wezel = wezel.nast;
                }
                Wezel pom = wezel.nast;
                wezel.nast = new Wezel(k,pom);
            }
        }


    pola w klasie Wezel sa publiczne(sama Staszak tak kazała ;) ) więc nie bawiłam się w gattery i settery, bo po co.
    dodajPierwszy() dodaje pierwszy element (polu pierwszy klasy lista przypisywana jest referencja do 1 elementu). mniejszaOd() to metoda klasy karta, coś na wzór compareTo ;)
    wiem, że nie jest to eleganckie, u Rataja by nie przeszło, ale zabawa co tydzień w pisanie 5 pięknych klas mnie nie bawi, więc upraszczam sobie pracę jak mogę ;)
    d41d8cd98f00b204e9800998ecf8427e
  • hardon  
    Phoenix!
    Wydział: W-8 IZ
    Rok studiów: 2

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Pani Staszak na laborkach mówiła, żeby nie używać odwołań do elementów poprzez indeksy, wiele osób miało z tym problemy.
    d41d8cd98f00b204e9800998ecf8427e
  • kobier  
    Wydział: W-8 IZ
    Rok studiów: 3

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Podziele się moim pomysłem na listę wiązaną jednokierunkową ;) (troche inspirowany książką)
    A w ogóle, to kod powyżej to nie dzieło Rataja, tylko Rossa & Harrisa od "Algorytmy. Od podstaw" :P
    Kod:

    public class SingleLinkedList implements List
    {
        private final Element _sentinel = new Element(null);
        private int _size;
       
        public SingleLinkedList()
        {
            clear();
        }
       
        public void add(Object value)
        {
            insert(size(), value);
        }
       
        public void insert(int index, Object value) throws IndexOutOfBoundsException
        {
            ++_size;
            checkBounds(index);
            Element e = _sentinel;
            for(int i = 0; i < index; i++)
            {
                e = e.getNext();
            }
            Element old = e.getNext();
            e.setNext(new Element(value));
            e.getNext().setNext(old);
        }
       
        public Object delete(int index) throws IndexOutOfBoundsException
        {
            checkBounds(index);
            Element e = _sentinel;
            for(int i = 0; i < index; i++)
            {
                e = e.getNext();
            }
            Object value = e.getNext().getValue();
            e.setNext(e.getNext().getNext());
            --_size;
            return value;
        }
       
        private void checkBounds(int index)
        {
            if(index < 0 || index >= _size)
            {
                throw new IndexOutOfBoundsException();
            }
        }
       
        public Object get(int index)
        {
            checkBounds(index);
            Element e = _sentinel.getNext();
            for(int i = 0; i < index; i++)
            {
                e = e.getNext();
            }
            return e.getValue();
        }
       
        public void clear()
        {
            _sentinel.setNext(_sentinel);
            _size = 0;
        }
       
        public boolean isEmpty()
        {
            return _size == 0;
        }
       
        public int size()
        {
            return _size;
        }
       
        public void display()
        {
            Element e = _sentinel.getNext();
            while(e != _sentinel)
            {
                System.out.println(e);
                e = e.getNext();
            }
        }
       
        private class Element
        {
            private Object _value;
            private Element _next;
           
            public Element(Object value)
            {
                setValue(value);
            }
           
            public void setValue(Object value)
            {
                _value = value;
            }
           
            public Object getValue()
            {
                return _value;
            }
           
            public Element getNext()
            {
                return _next;
            }
           
            public void setNext(Element next)
            {
                _next = next;
            }
           
            public void attach(Element next)
            {
                next.setNext(_sentinel);
                setNext(next);
            }
           
            public String toString()
            {
                return _value.toString();
            }
        }
    }


    Kod do zadania do Suszko, więc można wywalić np. display() ;)
    _________________
    God grant me the serenity to accept things I cannot shoot
    The courage to shoot things I can
    and the wisdom to hide the bodies ....
    d41d8cd98f00b204e9800998ecf8427e
  • Zibo
    Outsider
    Wydział: W-8 IZ
    Rok studiów: 3

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Never napisał/a:
    nigdy nie wiadomo co się stanie- raz wyskoczy mi NullPointerException, raz pętla się zapętli a raz nic się nie stanie(element nie zostanie dodany ale program zakończy działanie)


    Koniecznie zapoznaj się z obsługą debugger'a (domniemam, że jeszcze tego nie zrobiłeś) - potrafi naprawdę sporo czasu oszczędzić i pomóc poprawić błędy prawie niemożliwe do znalezienia 'na oko'.

    Kod:
    if( pierwszy.getNext() == null )


    Strzelam (bo nie ma info czym dokładnie jest 'pierwszy'), że ta linijka może wywoływać NullPointerExc, bo pierwszy zapewne może być null'em i wtedy mamy null.getNext(). (no chyba, że to początkowo wartownik, ale jak już mówiłem... ;) )
    d41d8cd98f00b204e9800998ecf8427e
  •  Ashall  
    Wydział: W-8 IZ
    Rok studiów: 2

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • http://www.wrzucaj.com/658396
    Laborki 4 i laborki 5. Laborki 4 są ostro pokombinowane, jeżeli zastosujesz mój styl zapisu to polegniesz, bo jest, cholera, zbyt charakterystyczny ;P
    Jeżeli już skorzystasz z tej wiedzy kliknij na http://www.wrzucaj.com/658396&del=153156 - usunie to link z tego serwera.
    ----
    To, co mówili koledzy to prawda - częstokroć musisz zaostrzyć kryteria przy dodawaniu i modyfikowaniu obiektów, zwłaszcza jeśli chodzi o skrajne przypadki - tablica jest pusta, IndexOutOfBoundsException, itp. Proponuję też nie bawić się w GetNext() tylko operować na samych zmiennych elementu - el.next, el.dane itp. Nie sprawdzałem tego, ale metoda GetNext ma wyrzucać elementy typu Element, tym samym jeżeli przypadkiem pod nextem jest NULL to może wydać NullPointerException.
    Pani Staszak nie powiedziała jednej dosyć istotnej rzeczy: mamy tworzyć metody, które nam ułatwią stworzenie maina i zgodnie z założeniami maina, czyli lista jest uporządkowana podczas układania, elementy nie są losowo!!!
    Ponieważ mamy listę kart, które są z góry uporządkowane (w klasie lista czy gdziekolwiek mamy wstawianie elementów po kolei), to nie musimy operować na indexach. Po prostu metoda Dodaj(Karta k) ma nam zapisywać gdzieś tam listę wyrazów mniejszych niż wartość wrzuconej karty (while(k.wartosc<pomocniczaLista.wartosc) dopisuj do nowej listy, odpisuj od starej). W momencie osiągnięcia równości Dokleja nam starą listę (z której wyrzuciliśmy część elementów) do nowego elementu "k" (tam nie wiem, pom = new Element(k); pom.nast = pomocniczaLista;) i tym razem while(pom2 {do którego wrzucaliśmy elementy mniejsze od karty k} !=null) doklejaj na początek elementy z pom2 (bowiem pom2 jest wywrócone na lewą stronę). W ten sposób zalgorytmizowaliśmy metodę Dodaj.

    A co do twojego wytworu, to nie mam pojęcia jak on działa bez znajomości metody getElement(). Najprawdopodobniej błąd polega na tym, że operujesz na fikcyjnym elemencie - robiąc getElement(index).setValue(value); zapewne robisz coś takiego: pobierz element, zapisz go w pamięci. W pamięci ustaw cośtam. Ale nie zwracasz tego spowrotem. Musisz operować na całym ciągu - zapamiętać gdzieś poprzednie wartości, ustalić dane edytowanej i dopiero wtedy dokleić - inaczej tego nie widzę.
    d41d8cd98f00b204e9800998ecf8427e
  • wrtnc7  
    INF
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Ashall napisał/a:
    Ponieważ mamy listę kart, które są z góry uporządkowane (w klasie lista czy gdziekolwiek mamy wstawianie elementów po kolei), to nie musimy operować na indexach. Po prostu metoda Dodaj(Karta k) ma nam zapisywać gdzieś tam listę wyrazów mniejszych niż wartość wrzuconej karty (while(k.wartosc<pomocniczaLista.wartosc) dopisuj do nowej listy, odpisuj od starej). W momencie osiągnięcia równości Dokleja nam starą listę (z której wyrzuciliśmy część elementów) do nowego elementu "k" (tam nie wiem, pom = new Element(k); pom.nast = pomocniczaLista;) i tym razem while(pom2 {do którego wrzucaliśmy elementy mniejsze od karty k} !=null) doklejaj na początek elementy z pom2 (bowiem pom2 jest wywrócone na lewą stronę). W ten sposób zalgorytmizowaliśmy metodę Dodaj.

    ??
    Jakie doklejanie list? Po prostu przy dodawaniu karty wstawiasz ją w odpowiednie miejsce w liście.
    Kod:
       public void dodaj(Karta d) {
           if (pierwszy==null || d.getWartosc()<pierwszy.dane.getWartosc())
               dodajPierwszy(d);
           else {
                Wezel w1=pierwszy;
                Wezel w2=pierwszy.nast;
                Wezel ins=new Wezel(d);
                while (w2!=null && w2.dane.getWartosc()<d.getWartosc()) {
                    w1=w2;
                    w2=w1.nast;
                }
                if (w2!=null) {
                    ins.nast=w2;
                    w1.nast=ins;
                }
                else
                    w1.nast=ins;
            }
       }

        public void dodajPierwszy(Karta d) {
            Wezel el=new Wezel(d);
            el.nast=pierwszy;
            pierwszy=el;
        }
    _________________
    Im lepiej widać piersi, tym trudniej zapamiętać twarz.
    d41d8cd98f00b204e9800998ecf8427e
  •  Ashall  
    Wydział: W-8 IZ
    Rok studiów: 2

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Doklejanie - w sensie to co ty zrobiłeś - szukałeś odpowiedniego miejsca na zmienną, przepisując dane do innego węzła, po czym po znalezieniu odpowiedniego miejsca dodajemy i doklejamy pozostałe elementy. Dziwnie to brzmi, ale tak sam to sobie rozumowałem i działałem.
    d41d8cd98f00b204e9800998ecf8427e
  • wrtnc7  
    INF
    Wydział: W-8 IZ
    Rok studiów: 4

    zobacz profil
    szybka wiadomość
  • 0
  • cytuj |

  • Ja nic nie doklejam :D
    Znajduję odpowiednie miejsce na wstawienie elementu, po czym poprzez modyfikację wartości pola "nast (next czy jak to tam zwał)" wstawiam nowy element między dwa, których używałem do przeszukiwania listy. Więc dokonuję tutaj modyfikacji maksymalnie trzech elementów, a nic nie doklejam :P Może nieskładnie to tłumaczę, ale mamy tutaj dwa różne rozwiązania :P
    Pozdrawiam
    d41d8cd98f00b204e9800998ecf8427e

Powered by phpBB modified by Przemo © 2003 phpBB Group. Then, after many years modified again, this time by Piotrek © 2014
Strona wygenerowana w 18,4ms. Zapytań do SQL: 14