Witam,
mam pewien problem ze stworzeniem bazy danych w javie, a w zasadzie przetlumaczeniem swojego programu z C++ ;).
Mam klase Dane, gdzie mam takie pola jak imie, nazwisko, adres, nr telefonu oraz funkcje pozwalajace zmieniac i czytac te pola. W mainie tworze obiekt typu Dane, ustawiam parametry obiektu i chce go dodac do listy LinkedList().
Tu nastepuje zonk. Gdy wpisuje lista.add(oDane) niby wszystko wyglada dobrze, ale gdy wyswietlam zawartosc listy, wypisuje mi Dane@1f6a7b9 zamiast poszczegolnych pol. Rozumie, ze LinkedList() nie sluzy do dodawania obiektow, albo ja robie cos nie tak ;). Czy ktos mi moze powiedziec jaka funkcja pozwoli mi dodawac obiekty mojej klasy, bo jak widac ja jestem w tym zielony.
Z gory dziekuje za odpowiedzi :)
@koru, wszystko jest dobrze. Napis Dane@1f6a7b9 oznacza identyfikator obiektu w systemie. Jeżeli chcesz wypisać zawartość pól obiektu nalezy przeładować metodę toString:
public class Dane{
String pole1;
String pole2;
// inne pola i metody
public String toString(){
return "pole1: "this.pole1+"| pole2: "+pole2;
}
}
LinkedList służy do przechowywania obiektów w postaci listy wiązanej dwu lub jedno kierunkowej :)
Dzieki, dziala :). Tylko jest jeszcze jeden problem. Powiedzmy utworze 5 obiektow i dodam je do listy. Jak uzyskac dostep np. do pola nazwisko w drugim elemencie listy? Wpisujac lista.get(1) wypisuje mi teraz wszystko.
Powoli sie przekonuje do tej javy, fajnie sa rozwiazane te listy :D.
Z gory dziekuje za odpowiedz.
Jak masz obiekt to możesz dla jego pól napisać metody ustawiające i zwracające typu get i set;
public class Dane{
private String pole1;
///
public String getPole1(){
return this.pole1
}
public void setPole1(String pole1){
this.pole1= pole1;
}
}
Koru
Tak wlasnie robie. Nie mam problemu zeby dostac sie do obiektu, tylko do obiektu zapisanego w ArrayList(). Przykladowo, mam 5 obiektow. Gdy chce wypisac wszystkie elementy listy, wypisuje System.out.println(lista);. Gdy chce wypisac jeden obiekt listy uzywam System.out.println(lista.get(i);, gdzie i jest indeksem listy. Ale powiedzmy, ze potrzebuje tylko wypisac pole nazwisko z pojedynczego elementu listy. System.out.println(lista.get(i).getNazwisko(); niestety nie dziala ;).
Z gory dziekuje za odpowiedz
niemozliwe! musi dzialac. jaki masz blad?
pozdrawiam
mozliwe, choc baaaardzo malo prawdopodobne, ze musisz miec zadeklarowaną listę konkretnych obiektów:
List<Nazwa_Twojej_Klasy> list;
ale takie udziwnienia potrzebne mi były w sumie tylko np. przy pisaniu jakiegoś klienta WebServices, przejrzyj jeszcze raz uważnie kod...
i zapodaj błąd jaki Ci się pokazuje
Błąd:
343: cannot find symbol
symbol : method getNazwa()
location: class java.lang.Object
System.out.println(aLista.get(0).getNazwa());
metoda getNazwa() z klasy Dane:
public String getNazwa()
{
return Nazwa;
}
aLista jest LinkedList i dodaje do niej w ten sposob: aLista.add(dane), gdzie dane jest typu Dane (wczesniej ustawiam pola za pomoca dane.setNazwa()).
przy okazji - jesli uzywasz "get" to NIE uzywaj LinkedListy tylko ArrayListy!!! Linked powinno sie uzywac TYLKO gdy pobierasz getFirst() lub przechodzisz liste iteratorem!
pozdrawiam
czyli masz dokładnie to o czym powiedziałem, zrób tak:
przy deklaracji tej listy zastosuj 'jawną deklarację' tzn. że ma być to lista dokładnie obiektów typu Dane, bo w przeciwnym wypadku zrobi on listę obiektów typu Object, należy wtedy przed każdym dostępem do listy 'powiedzieć kompilatorowi, że chodzi nam o konkretną klasę i stosuje się jawne rzutowanie '.
(Dane)(aLista.get(i)).getNazwisko();
ja proponuję jednak coś takiego:
przy deklaracji listy:
ArrayList<Dane> aLista = new ArrayList<Dane>();
wówczas wiadomo, że jest to lista obiektów Dane, i wszystko powinno działać już bez rzutowaia...
pzdr.
Ech... moj blad (wybaczcie, nie spalem przez ten program ;p). aList jest ArrayLista...
ArrayList<Dane> aLista = new ArrayList<Dane>();
rozwiazalo problem, wiec rzutowania nawet nie sprawdzalem.
Odpowiedz przyszla szybciej niz zdazylem zauwazyc wlasny blad, bardzo dziekuje :D