meineLEEREArrayList.set(index, object) --> IndexOutOfBoundsException

  • Hallo,


    ich hätte mal wieder eine Frage ;) Ich nutze in meiner Activity eine ArrayList festgelegter Kapazität:


    Java
    private ArrayList<Button> inside1Buttons = new ArrayList<Button>(100);


    die ich an anderer Stelle gern mit Buttons füllen möchte. Jeder dieser Buttons benötigt grundsätzlich eine ID, sodass ich gern den "Index" des Buttons innerhalb der Liste hierfür nutzen würde. Leider führt aber z.B.


    Java
    inside1Buttons.set(1, myNewButton);


    zu einer IndexOutOfBoundsException (Invalid index 1, size is 0). Wenn ich mir die ArrayList vorher im Debugger ansehe, besitzt diese tatsächlich ein Array aus 100x "null", aber eine size von "0" (was ja sinnig ist, da size die Anzahl der Objekte liefert).


    Mit einem Array aus Buttons ( Button[] myButtons = new Buttons[100]; ) sollte das Ganze ja funktionieren, mir stellt sich also die Frage - und ich werd nicht recht schlau draus - wo eigentlich genau der Unterschied (Vorteile, Nachteile) zwischen beiden liegt.. Ich kanns grad nicht testen, aber zB iterieren kann ich doch auch über ein Array?


    EDIT: Was dem Array natürlich fehlt sind die Methoden contains(), indexOf(), ... Gibt´s also ggf. einen Weg, o.g. Problem auch mit einer ArrayList zu umgehen?


    Grüße,
    FargoTof

  • ArrayList ist kein Array - darum machst du schon mit new ArrayList<Button>(100); zuviel des Guten - lass die 100 einfach weg, die ArrayList wird schon noch wachsen. ^^


    Du kann Elemente einfach zufügen mit:


    Java
    inside1Buttons.add(myNewButton);


    Das ist ja der Hauptvorteil von ArrayList im Vergleich zu Arrays - es kann wachsen!!!


    Und mit

    Java
    Iterator<Button> buttonIterator = inside1Buttons.iterator();


    bekommst du einen hübschen Iterator...

  • Hey, danke für die Antwort! Das eine List automatisch mitwächst, habe ich verstanden. Mein Problem ist aber folgendes, hab ich wohl unklar ausgedrückt: Meine Buttons "repräsentieren" Objekte einer Klasse mit jeweils einer id --> Klick auf Button x bearbeitet Objekt mit id=x. Die IDs sind nicht zwingend fortlaufend, sodass ich die Buttons trotzdem gerne so:


    1. Button für Objekt 1
    2. Button für Objekt 2
    3. leer
    4. leer
    5. Button für Objekt 5
    6. Button für Objekt 6
    ...


    in der Liste hätte, was aber bedingt, dass ich der (anfangs leeren) Liste u.U. als erstes zB Button 6 hinzufügen können müsste. Das geht so halt nicht. Aber anscheinend muss ich mir da einen anderen Mechanismus bauen (HashMap o.ä.), was mir nicht so komfortabel erscheint. Richtig?

  • Hallo erzeuge dir doch einfach dein eigenes Objekt


    class workflow {


    int id
    Button button
    }


    hier dann jede Menge Init Kram ....




    und dann nutzt Du keine Arraylist von Button, sondern von deinem Objekt Arraylist<workflow> , da kannst du ID und Button bündeln wie du magst.




    PS: die Index outofbouds bekommst du logischer Weise, da du die 100 Objekte nicht instanziert hast. (sprich angelegt)

  • Wenn du schon selber HashMap vorschlägst, dann immer ran - es ist die bessere Datenstruktur, wenn du eine key-value-Paare speichern willst.


    Dann geht das aber nicht mit int sondern mit Integer für deine Zähler - HashMap braucht Objekte.


    Und bei der HashMap kannst du dir sogar verschiedene Iterator aussuchen (z.B. keySet().iterator()),

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!