-
-
-
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
d41d8cd98f00b204e9800998ecf8427e
-
-
-
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
-
-
-
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"
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
-
-
-
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
-
-
-
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
-
-
-
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
-
-
-
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
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
|