Gå til innhold

Hvordan bruke et ArrayList på objekter?


Anbefalte innlegg

Hei

 

Jeg driver å lærer java for tiden og har fått et problem.

 

while(carIterator.hasNext) {
           Bil car = (Bil) carit.next();                   //Her er problemet
           Point carpos = car.getPos();
           page.fillRect((int)carpos.getX(), (int)carpos.getY(), car.getDimW(),  
                         car.getDimH());
}

 

Jeg har en klasse som heter Bil som jeg har opprettet objekter av og lagt til i en array list. Som dere ser vil jeg ha tilgang til noen metoder i klassen Bil.

 

Har ikke lyst til å gå løs på hvert objekt uten å bruke en arraylist.

 

Hvordan få hentet ut disse objektene så jeg sitter med det samme resultatet som jeg ville hatt ved Bil car = new Bil(); ?

Endret av martiol
Lenke til kommentar
Videoannonse
Annonse

Sånn jeg har forstått problemet er det at du har lagt til objektene av klassen bil i en arraylist og når du henter de ut igjen får du ikke tilgang til metodene i klassen bil. Det du må gjøre da er å "caste" objektene når du henter de ut igjen. Som du ser av add-metoden i ArrayList så kan du kun legge til Object :

 

boolean add(Object o)

Appends the specified element to the end of this list.

 

Dvs. at når du henter bilene ut igjen vil de bli tolket som object (som er en helt grunnleggende klasse i java som alle andre arver) og ikke som bil. Det du må gjøre da er at du må caste object'et til Bil igjen når du henter det ut.

 

Det gjøres slik:

 

Bil car = (Bil)carit.next();

 

Det betyr at det objektet som blir returnert av next() er av klassen Bil.

Hvis det ikke er det får du et ClassCastException hvis jeg ikke husker feil.

Så hvis det ligger objekter av andre klasser enn Bil i ArrayList'en bør kan du f.eks. sjekke hvilket objekt det er med:

 

Object noe = carit.next();

if ( noe instanceof Bil){

Bil car = (Bil)noe;

}

 

Håper dette var til hjelp :)

Lenke til kommentar

hmm

 

Jeg får denne ConcurrentModificationException

i linjen Object noe = carit.next();

 

This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible. For example, it is not generally permssible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined under these circumstances. Some Iterator implementations (including those of all the collection implementations provided by the JRE) may choose to throw this exception if this behavior is detected. Iterators that do this are known as fail-fast iterators, as they fail quickly and cleanly, rather that risking arbitrary, non-deterministic behavior at an undetermined time in the future.

 

JBuilder doc.....

 

Jeg er ikke helt sikker på hva det betyr.

 

Ellers takk for å få meg på rett vei.

Lenke til kommentar
hmm

 

Jeg får denne ConcurrentModificationException

i linjen Object noe = carit.next();

Du kan ikke gjøre endringer i listen (legge til/fjerne elementer) mens du holder på å iterere gjennom den.

 

Enten kan du lage en kopi av listen og så iterere gjennom denne kopien, eller så kan du lage en ny iterator og begynne på nytt hvis du må legge til nye elementer underveis.

 

Om du vil fjerne elementer kan du sikkert bruke Iterator's remove() metode.

Lenke til kommentar

Du har også muligheten til å synkronisere trådene på listen, slik at kun en får tilgang av gangen. Da slipper du at GUI-tråden iterere gjennom lista men hovedtråden legger til ny bil, siden kun en får tilgang av gangen.

 

Det er ofte minnevennlig enn å lage masse kopier eller hvis listen er stor...

 

synchronized (myObject)

{

//Kritisk kode

}

 

mvh

CPL

Lenke til kommentar
Men jeg har ikke kommet noe lenger....

 

Object obj = carit.next();
if (obj instanceof Bil)

Blir aldri sann?.? :hmm:

Hmm.. Lykke til med denne - sikkert bare en banal feil et eller annet sted.. :)

 

 

En liten ting angående bruken av instanceof.. Er stort sett veldig dårlig design å bruke reflection for å finne ut hvordan du skal behandle et objekt.

 

Hvis to klasser er like, i.e. du bruker dem til det samme/på samme måte bør du sørge for at de deler samme type også, ved å la begge arve fra en baseklasse.

Hvis det ikke er noen sammenheng mellom de to klassene blir det helt feil å lagre dem i samme container - du bør heller lage en liste for hver.

 

Med kun én type i containeren er det ikke lenger noen grunn til å bruke instanceof - du kan caste til baseklassen med en gang.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...