Avatar billede dennism Nybegynder
20. oktober 2007 - 18:24 Der er 15 kommentarer og
1 løsning

Java: ArrayList, er indsat?

Jeg har et arrayList<Integer> kaldet list. Før jeg indsætte noget med metoden add til denne list, vil jeg først tjekke om det Integer jeg forsøger at indsætte iforvejen er indsat i list - jeg vil nemlig ikke have nogle dubletter.

Hvordan klarer man det? Jeg synes ikke at kunne finde en metode i ArrayList som kan klare det.
Jeg forsøgte derfor at lave min egen liste som extender ArrayList:

public class MyList<E> extends ArrayList<E> {
    public MyList() {
    }
   
    public boolean isIn(E object) {
        for (int n = 0; this.size()<n; n++) {
            if (this.get(n).equals(num)) return true;
        }
        return false;
    }
}

Der har jeg lavet metoden isIn, som tjekker om det pågældende objekt er i listen. Er det den rigtige måde at gøre det på? ..problemer er bare, at jeg ikke rigtigt synes at min metode isIn virker :(
Avatar billede erikjacobsen Ekspert
20. oktober 2007 - 18:29 #1
Det er da en sjov for-løkke. Mon ikke

for (int n = 0; n<this.size(); n++) {
Avatar billede dennism Nybegynder
20. oktober 2007 - 18:29 #2
Der var lige en lille fejl i den isIn jeg indsatte:

    public boolean isIn(E object) {
        for (int n = 0; this.size()<n; n++) {
            if (this.get(n).equals(object)) return true;
        }
        return false;
    }
Avatar billede erikjacobsen Ekspert
20. oktober 2007 - 18:30 #3
...og hvor kommer "num" fra ?
Avatar billede erikjacobsen Ekspert
20. oktober 2007 - 18:30 #4
ok... ;)
Avatar billede dennism Nybegynder
20. oktober 2007 - 18:31 #5
Tak, det hjalp :) Men er ideen god, eller finder der noget nemmere?
Avatar billede erikjacobsen Ekspert
20. oktober 2007 - 18:32 #6
Har du kigget på ArrayList metoden: indexOf ?
Avatar billede erikjacobsen Ekspert
20. oktober 2007 - 18:34 #7
Og hvis rækkefølgen ikke er vigtig, så er der Map. En ArrayList vil bruge en lineær søgning for at se om elementet allerede er der - en Map kan gøre det lidt smartere, så det går hurtigere for mange værdier.
Avatar billede dennism Nybegynder
20. oktober 2007 - 19:19 #8
Hvordan vil jeg i denne sammenhæng skulle bruge indexOf? Kan ikke helt gennemskue det.

Har du evt. et bud på denne:
http://www.eksperten.dk/spm/801970
Avatar billede erikjacobsen Ekspert
20. oktober 2007 - 19:32 #9
indexOf laver næsten det samme som din isIn
Avatar billede dennism Nybegynder
20. oktober 2007 - 21:30 #10
..den returnerer bare -1 i stedet for false. Korrekt?

Du må meget gerne smide et svar? Kan du måske hjælpe mig med at sortere et ArrayList<Integer> ?
Avatar billede erikjacobsen Ekspert
20. oktober 2007 - 21:40 #11
Ja, hvis svaret fra indexOf er 0 eller større, så findes den, og det -1 så findes den ikke. Det er sikkert lavet stort set som din isIn.

Jeg samler slet ikke på point, tak. Svar selv, accepter eget svar.
Avatar billede arne_v Ekspert
20. oktober 2007 - 21:49 #12
Den ekvivalente metode er vel:
  contains
Avatar billede arne_v Ekspert
20. oktober 2007 - 21:50 #13
Iøvrigt anbefaler man normalt at encapsulate ArrayList fremfor at extende.
Avatar billede dennism Nybegynder
21. oktober 2007 - 10:44 #14
Tak for hjælpen her. Contains udfører det samme arbejde som min isIn, men det skulle undre mig om den ikke var lidt smartere.

Vil du have point arne_v?
Avatar billede arne_v Ekspert
21. oktober 2007 - 21:45 #15
Den er nu ikke så meget smartere.

Den bruger indexOf og indexOf laver en løkke.

Eneste fordel den har er at den kan bruge arrayet inden i ArrayList direkte fremfor
at bruge get.

Du ved godt at JDK kommer med kilde tekst til klasserne så du kan kigge ?

Og den med ikke at extende collection klasser er altså en god pointe.

Og et svar.
Avatar billede usse Nybegynder
22. oktober 2007 - 14:36 #16
Hvorfor ikke bruge en anden datastruktur hvis du ikke vil tillade dubletter? Hvorfor ikke bruge et HashSet evt?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester