wyswietl element ArrayListy

0

Witam :)

mam taki maly problem. nie dziala mi czesc programu bez wywalenia konkrentego bledu. sa to 3 krotkie funkcje i wiem ze podczas dzialania program je wszystkie odwiedza.. ale do rzeczy.

Main.java:

...
private Zbior zbior = new Zbior();
...
private void pokazPostac() {
        System.out.println("Podaj imie postaci, ktora chcesz wyswietlic: ");
        String podane_imie = sc.nextLine();
        // wyszukiwanie i wyswietlanie danej postaci
        zbior.WyszukajImie(podane_imie);       
    }

Zbior.java:

public void wyswietlKonkretnaPostac(Postac po){
        System.out.println("wyszkaj imie..");
        System.out.print("SYSTEM: " + po.getSystem() + " ");
        System.out.print("IMIE: " + po.getImie() + " ");
        System.out.print("LEVEL: " + po.getLvl() + " ");
        System.out.println("");
    }
    
    public void WyszukajImie(String podane_imie) {
        for(Iterator ite = postaci.iterator(); ite.hasNext(); ) {
            Postac po = (Postac) ite.next();
           
            if(po.getImie() == podane_imie) {
                wyswietlKonkretnaPostac(po);
                 
            }
            
        }
    }

jesli to za malo kodu i blad moze tkwic gdzies indziej to moge wrzucic na server i umiescic. albo chociaz za zwrocenie uwagi na potencjalne bledy byloby ok :)

i jeszcze raz - nie wyswietla zadnych ostrzezen, errorow itd.. po prostu po wpisaniu imienia podaje "wyszukaj imie.." i nie interpetuje w ogole

    System.out.print("SYSTEM: " + po.getSystem() + " ");
    System.out.print("IMIE: " + po.getImie() + " ");
    System.out.print("LEVEL: " + po.getLvl() + " ");

czy trzeba ten element tez w tej funkcji deklarowac?

bede wdzieczna za kazda pomoc. :)

0

Błąd jest tutaj:
po.getImie() == podane_imie

Napisy należy porównywać tak: po.getImie().equals(podane_imie).

Inna sprawa, że zbioru nie trzeba samemu implementować.
W Twoim przykładzie najlepszą strukturą danych będzie HashMap z kluczem Imie.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/HashMap.html

Map postacie = new HashMap();
Postac postac = new Postac();
postacie.put("Jakies_Imie", postac);

(...)

Postac postac = (Postac) postacie.get("Jakies_Imie");
if (postac != null) 
  wyswietlKonkretnaPostac(postac);
0

Czego oczekujesz od porównania
po.getImie() == podane_imie
?
Porównywane są wskaźniki (adresy miejsc w pamięci gdzie są przechowywane Stringi)
Zawartość należy porównywać tak:
po.getImie.equals(podane_imie)
lub
po.getImie.equalsIgnoreCase(podane_imie)
Pozdrawiam

0

a i ja dorzucę swoje. W javie 5 masz generiksy, które pozwalają na olanie rzutowania w kodzie:

ArrayList<Postac> ar = new ArrayList<Postac>();

w dodatku nie musisz używać iteratorów:

for(Postac p : ar){}
0

HashMap faktycznie byloby dobrym rozwiazaniem tylko z tego co wiem to nie jest rozszerzalna, a tutaj musi istniec mozliwosc dodawania nowych elementow..

a czy przenoszenie ze ArrayLista na HashMap obecnego stanu ArrayList i przeszukiwanie go byloby ok? czy wydajniejsze pozostaje przeszukiwanie ArrayLista czy to skrocona for czy iteratorem?

i dziekuje za podpodziedz z for zamiast Iteratora :)

aa i osobna sprawa ze nadal nie dziala.. zachowuje sie tak jakby wpisywanego imiena nie bylo na liscie, a jest.. elementy w ArrayLiscie tez sa bo funkcja pokazywania wszystkich wpisow dziala i ladnie wszystko podaje... jeszcze zaraz pokombinuje.

0

aaa, dobra, dzialac juz ladnie dziala. tylko pytanie o HashMapa z postu wyzej nadal aktualne :) bo jak juz robic cos to lepiej zrobic to wydajnie :) bede wdzieczna

0

Zrobiłem mały test i wyszło, że hashmapa jest szybsza niezależnie od ilości elementów(nawet jeżeli szukany element na liście jest jako pierwszy, to i tak hashmap jest szybszy-to mnie trochę zaskoczyło)
Co więcej, samo zrobienie "for(Postac p:l){};" dla l-pustej listy jest droższe od wyszukania w mapie.

Jak najbardziej można do mapy dodawać nowe elementy(operacja put(klucz, wartość)) oraz je usuwać (remove(klucz)).

HashMap ma tylko kilka ograniczeń:
-można wstawić tylko jeden element o danym kluczu
-elementy nie są ułożone w żadnej sensownej kolejności(aby to obejść można stosować LinkedHashMap)
-zużywa trochę więcej ramu od listy

0

przekonujace to slowa. dzieki i przerzucam sie na HashMap.

0

pojawil sie kolejny problem. pomimo wszelkich prob nie udalo mi sie przy uzyciu HashMapy wyswietlic wszystkich elementow... <wstyd> a nie chce tego robic zamieniajac liste na tablice.. wyszukalam set i keySet jednak nie moge poprawnie zapisac tych kilk linijek.. bede wdzieczna za podpowiedz.

jest podane:

private Map postaci = new HashMap();

oraz trzeba powiedziec jakos f-cji pozniej zeby wyszukiwala wszystkie elementy (set?) a nie tylko jeden jak jest teraz:

    public void wyswietlPostaci(String pokaz) {
          
           Postac p = (Postac) postaci.get(pokaz);
           
            if (p != null)
                System.out.print("SYSTEM: " + p.getSystem() + " ");
            System.out.print("IMIE: " + p.getImie() + " ");
... }

String pokaz to klucz w zbiorze ktory ma wartosc t albo n. (pokazywac postac czy ukryc podczas wyswietlania wszystkich postaci). pokaz jest opcjonalne, a wiem ze keySet nie przyjmuje zadnych parametrow to z pokaz mozna w ogole zrezygnowac..

Pyt nr2: - juz niby dalam rade ale zmienialam troche kod, ciekawosc czemu to jest zle nadal zostala. :)

czemu nie dziala? :( konkretnie nie dziala setSystem, zapetla sie - zapisuje i wola o nowa zmiane. zapisuje nowa wersje i pyta na jaka inna zmienic..

private void edytujPostac() {
Postac postac = (Postac) zbior.postaci.get(podane_imie);
System.out.println("Co chcesz zmienic?");
        System.out.println("[s]ystem [i]mie [l]vl [w]iek");
while(true){
            if(co.length() == 1){
                switch (co.charAt(0)) {
                    case 's':
                    case 'S': zmienSystem(postac); break;
                    .....
                  default: System.out.println("Wpisano niepoprawny znak");
                }} else System.out.println("Wpisz poprawny znak");
        }
    }
 private void zmienSystem(Postac p) {
        System.out.println("Obecny system:" + p.getSystem() + "  Na jaki chcesz zmienic?:");
        String nowy = sc.nextLine();
        p.setSystem(nowy);
    }

no i oczywiscie sa ustawione gety i sety:

public String getSystem() {
        return system;
    }

    public void setSystem(String system) {
        this.system = system;
    }

wdzieczna bede za kazda podpowiedz.

0
 Map <String,Postac> map = new HashMap<String,Postac>();
for(Map.Entry entry: map.entrySet()){
    String imie = (String) entry.getKey();
    Postac postac = (Postac) entry.getValue();
     //robisz coś z postacia
}

A nie zapomniałeś co = sc.nextLine();
przed
if(co.length() == 1){
?

0
__krzysiek85 napisał(a)
 Map <String,Postac> map = new HashMap<String,Postac>();
for(Map.Entry entry: map.entrySet()){
    String imie = (String) entry.getKey();
    String postac = (Postac) entry.getValue();
     //robisz coś z postacia
}

chyba nie za bardzo rozumiem jak to dziala.. ale jeszcze kombinuje i szukam. ;-)

edit: zaczynam lapac jak to dziala, w kazdym razie dziekuje :)

A nie zapomniałeś co = sc.nextLine();
przed
if(co.length() == 1){
?

boing :d oczywiscie ze tak :-D

0
Map <String,Postac> postacie = new HashMap<String,Postac>(); //zbior postaci

for(Map.Entry entry: postacie.entrySet()){ //przejdź po wszystkich postaciach, "entry" to para (imie, postac)
    String imie = (String) entry.getKey(); //wyciagamy z entry imie
    Postac postac = (Postac) entry.getValue(); //wyciagamy z entry postac
     //robisz coś z postacia
    System.out.println(postac.getLvl());
}

Muszę jednak przyznać, że operacja przechodzenia po wszystkich elementach jest tańsza i prostsza w przypadku listy.
Tak więc, jeżeli chcesz często wyszukiwać daną postać po imieniu użyj hashmapy, natomiast jeżeli w programie często chcesz coś robić dla wszystkich postaci, to użyj listy. Oczywiście nic nie stoi na przeszkodzie, aby mieć jednocześnie obie te struktury danych.

0

aaa

no ja tylko raz w jednym miejscu pokazuje wszystkie elementy, cala reszta opiera sie na wyszukiwaniu klucza. wiec raczej zostane przy jeden HashMapie.
tylko czas ja dokladniej poznac ;)

dzieki za wytlumaczenie. wyszukiwanie i wyswietlanie i wszystkich elementow i wybranych dziala. :-)

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