Fügen Sie ArrayList am angegebenen Index ein Objekt hinzu

140

Ich denke, es ist eine ziemlich einfache Frage, aber ich kann nicht herausfinden, wie ich das richtig machen soll.

Ich habe eine leere Arrayliste:

ArrayList<object> list = new ArrayList<object>();

Ich habe einige Objekte, die ich hinzufügen möchte, und jedes Objekt muss sich an einer bestimmten Position befinden. Es ist jedoch erforderlich, dass sie in jeder möglichen Reihenfolge hinzugefügt werden können. Wenn ich das versuche, funktioniert es nicht und ich bekomme eine IndexOutOfBoundsException:

list.add(1, object1)
list.add(3, object3)
list.add(2, object2)

Was ich versucht habe, ist das Füllen ArrayListmit nullund dann das oben genannte zu tun. Es funktioniert, aber ich denke, es ist eine schreckliche Lösung. Gibt es einen anderen Weg, dies zu tun?

J. Maes
quelle
7
Sie erhalten eine IndexOutOfBoundsException, weil die Liste leer ist und Sie nicht auf eine Listenposition zugreifen können, die nicht existiert ...
Vic
1
Gibt es eine Möglichkeit, diese Position zu erstellen, ohne die Liste mit Nullobjekten zu füllen? Für mich scheint es eine wirklich seltsame Lösung zu sein.
J. Maes
1
Ich glaube nicht ... Wenn Sie die Objekte in zufälliger Reihenfolge hinzufügen müssen, müssen Sie nach einer anderen Möglichkeit suchen. Zum Beispiel mit einem typischen Array: 'Object []' und dann sollten Sie nicht Ich muss es nicht füllen, sondern nur initialisieren
Vic
1
@ Maethortje es ist nicht wirklich ein komisches Problem. Suchen Sie nach spärlichen Listen. Reference.wolfram.com/mathematica/tutorial/… scheint ein guter Artikel zu sein. In Java ist eine Karte mit Index als Schlüssel möglicherweise der einfachste Ansatz.
Elende Variable
2
@Pan Auch wenn Sie die Größe deklarieren. Die Liste wird nicht initialisiert, sondern es wird angegeben, wie viel Speicherplatz Sie im Speicher reservieren möchten. Aus meiner Sicht ist eine Liste ein Array von Elementen, das auch einen Zeiger auf die Liste enthält nächstes Element. Wenn Sie versuchen, ein Element an der dritten Position hinzuzufügen, während das zweite leer (oder null) ist, haben Sie keinen Zeiger, der Ihnen hilft, zu wissen, dass es das dritte Element ist .: 1-> 2-> 3 ist in Ordnung, aber 1- > * -> 3 hier haben Sie ein Problem ...
Vic

Antworten:

208

Sie können es so machen:

list.add(1, object1)
list.add(2, object3)
list.add(2, object2)

Nachdem Sie Objekt2 zu Position 2 hinzugefügt haben, wird Objekt3 zu Position 3 verschoben.

Wenn Sie möchten, dass Objekt3 die ganze Zeit an Position3 ist, empfehlen wir Ihnen, eine HashMap mit Position als Schlüssel und Objekt als Wert zu verwenden.

superM
quelle
3
Eine Hashmap könnte dieses Problem tatsächlich lösen. Ich denke, ich werde mich für dieses entscheiden, da es nicht so aussieht, als könnte ich an Position 3 etwas hinzufügen, wenn an Position 2 kein Objekt vorhanden ist.
J. Maes
kurz aber die meisten Antworten. Andere sind einfach auf dem falschen Weg
Shabbir Dhangot
Eine konstruktive Logik!
Arsal Imam
30

Sie können ein Array von Objekten verwenden und es in ArrayList- konvertieren.

Object[] array= new Object[10];
array[0]="1";
array[3]= "3";
array[2]="2";
array[7]="7";

List<Object> list= Arrays.asList(array);

ArrayList wird [1, null, 2, 3, null, null, null, 7, null, null]

user3484940
quelle
2
Ein Nachteil ist, dass Sie die Größe im Voraus kennen müssen.
Daniel Hári
16

Wenn dies der Fall ist, sollten Sie ein reguläres Array verwenden, die Kapazität initialisieren und Objekte an den gewünschten Index setzen.

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;
medopal
quelle
Sie initialisieren die Kapazität, aber nicht die Größe der 'ArrayList'. Die Größe ist als Anzahl der Elemente definiert, und wenn der Index> Größe ist, kommt die Ausnahme ...
Vic
@Vic, ich habe die Frage zuerst falsch verstanden, aber danke für den Tipp.
Medopal
Ich habe die Kapazität bei 10 initialisiert, erhalte aber beim Hinzufügen eines Objekts immer noch ein IndexOutOfBoundsExceptopn. Gleiches gilt für das Ändern der Kapazität mit verifyCapacity. Das einzige, was funktioniert, ist im Moment mit Null zu füllen ...
J. Maes
@ Maethortje Suchen Sie nach dem Unterschied zwischen "Größe" und "Kapazität" ... Die Ausnahme kommt, wenn der Index> die Größe ist, nicht wenn es> Kapazität ist .....
Vic
Wie die Jungs erwähnt haben, fügen Sie ein Objekt bei Index 3 hinzu, während die Größe der Liste noch 1 beträgt. Das ist nicht möglich. Das Hinzufügen an einem bestimmten Index ist zulässig, solange sich dieser Index innerhalb der Grenzen der Liste befindet. Wenn Ihre Liste beispielsweise 3 Objekte enthält, können Sie kein Objekt am Index 100 hinzufügen.
medopal
14

Sie können ArrayList auch überschreiben, um Nullen zwischen Ihrer Größe und dem Element einzufügen, das Sie hinzufügen möchten.

import java.util.ArrayList;


public class ArrayListAnySize<E> extends ArrayList<E>{
    @Override
    public void add(int index, E element){
        if(index >= 0 && index <= size()){
            super.add(index, element);
            return;
        }
        int insertNulls = index - size();
        for(int i = 0; i < insertNulls; i++){
            super.add(null);
        }
        super.add(element);
    }
}

Dann können Sie an jeder Stelle in der ArrayList hinzufügen. Zum Beispiel diese Hauptmethode:

public static void main(String[] args){
    ArrayListAnySize<String> a = new ArrayListAnySize<>();
    a.add("zero");
    a.add("one");
    a.add("two");
    a.add(5,"five");
    for(int i = 0; i < a.size(); i++){
        System.out.println(i+": "+a.get(i));
    }
}   

ergibt dieses Ergebnis von der Konsole:

0: Null

1 Eins

2: zwei

3: null

4: null

5: fünf

EngineerWithJava54321
quelle
9

Ich mache Sie auf die ArrayList.addDokumentation aufmerksam , die besagt, dass sie wirft IndexOutOfBoundsException- wenn der Index außerhalb des Bereichs liegt (index < 0 || index > size() )

Überprüfen size()Sie die Liste, bevor Sie anrufenlist.add(1, object1)

Elende Variable
quelle
Sie haben Recht @Hemal, @Maethortje Warum überprüfen Sie nicht die Größe der Liste, bevor Sie das Element zur Liste hinzufügen? Überprüfen Sie, ob die Position, die Sie hinzufügen möchten, kleiner als die Größe der Liste ist. Wenn nicht, können Sie einfach eine normale Position list.add("element");
ausführen
1
So wie ich es verstehe, besteht das "Problem" darin, das Element an Position 3 hinzuzufügen, auch wenn sich kein Element an Position 2 befindet ...
Vic
@Vis das ist eine spärliche Liste - siehe meinen Kommentar zur Frage.
Elende Variable
5

Sie müssen die leeren Indizes mit Nullen füllen.

while (arraylist.size() < position)
{
     arraylist.add(null);
}

arraylist.add(position, object);
Miika Pakarinen
quelle
2
@Maethortje 

The problem here is java creates an empty list when you called new ArrayList and 

Beim Versuch, ein Element an der angegebenen Position hinzuzufügen, haben Sie IndexOutOfBound erhalten, sodass die Liste einige Elemente an ihrer Position enthalten sollte.

Bitte versuchen Sie Folgendes

/*
  Add an element to specified index of Java ArrayList Example
  This Java Example shows how to add an element at specified index of java
  ArrayList object using add method.
*/

import java.util.ArrayList;

public class AddElementToSpecifiedIndexArrayListExample {

  public static void main(String[] args) {
    //create an ArrayList object
    ArrayList arrayList = new ArrayList();

    //Add elements to Arraylist
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");

    /*
      To add an element at the specified index of ArrayList use
      void add(int index, Object obj) method.
      This method inserts the specified element at the specified index in the
      ArrayList.  
    */
    arrayList.add(1,"INSERTED ELEMENT");

    /*
      Please note that add method DOES NOT overwrites the element previously
      at the specified index in the list. It shifts the elements to right side
      and increasing the list size by 1.
    */

    System.out.println("ArrayList contains...");
    //display elements of ArrayList
    for(int index=0; index < arrayList.size(); index++)
      System.out.println(arrayList.get(index));

  }
}

/*
Output would be
ArrayList contains...
1
INSERTED ELEMENT
2
3

*/
Sankalp
quelle
Ich verstehe das Problem, das meinen Fehler verursacht. Es scheint, als müsste ich Objekte zu den nachfolgenden Positionen hinzufügen, bevor ich dieser Position ein Objekt hinzufügen kann. In dem Moment, in dem ich hinzufüge, entsorge ich nicht alle Objekte, die ich hinzufügen möchte. Denken Sie, dass das Hinzufügen von Nullobjekten dann eine richtige Lösung ist?
J. Maes
@ Maethortje Es wird nicht sehr fair sein, dies zu tun, da es nur ein Hack ist :)
Sankalp
Sie müssen die Codebeispiel-Anführungszeichen aus dem ersten Absatz entfernen.
Jalal Sordo
2

Wie wäre es mit dieser kleinen whileSchleife als Lösung?

private ArrayList<Object> list = new ArrayList<Object>();

private void addObject(int i, Object object) {
    while(list.size() < i) {
        list.add(list.size(), null);
    }
    list.add(i, object);
}
....

addObject(1, object1)
addObject(3, object3)
addObject(2, object2)
Stewart
quelle
2

Dies ist eine mögliche Lösung:

list.add(list.size(), new Object());
Darius
quelle
1

Ich denke, die Lösung von medopal ist genau das, wonach Sie suchen.

Eine weitere alternative Lösung besteht darin, eine HashMap zu verwenden und den Schlüssel (Integer) zum Speichern von Positionen zu verwenden.

Auf diese Weise müssen Sie es zunächst nicht mit Nullen usw. füllen. Kleben Sie einfach die Position und das Objekt in die Karte, während Sie fortfahren. Sie können am Ende ein paar Zeilen schreiben, um sie in eine Liste zu konvertieren, wenn Sie sie auf diese Weise benötigen.

Ashkan Aryan
quelle
Ist TreeMap nicht besser, da es nach Schlüsseln bestellt wurde?
Daniel Hári
1

Angenommen, Sie möchten ein Element an einer Position hinzufügen, dann muss die Listengröße größer als die Position sein.

add(2, item): Diese Syntax bedeutet, dass Sie das alte Element an Position 2 zum nächsten Index verschieben und das Element an Position 2 hinzufügen.

Wenn sich kein Element auf der 2. Position befindet, funktioniert dies nicht. Es wird eine Ausnahme ausgelöst.

Das heißt, wenn Sie etwas hinzufügen möchtenposition 2,

Ihre Listengröße muss mindestens (2 + 1) =3,so sein, dass die Elemente unter verfügbar sind0,1,2 Position.

Auf diese Weise wird sichergestellt, dass auf Position 2 sicher zugegriffen wird und es keine Ausnahme gibt.

Shamsul Arefin Sajib
quelle
2
Ich komme gerade vorbei, als ich Ihre Antwort benachrichtigt habe. Tatsächlich muss der Index zum Zeitpunkt des Einfügens eines neuen Elements kleiner oder gleich der tatsächlichen Länge der Liste sein. Beispiel: Listengröße ist 2: Das Hinzufügen von Index 2 funktioniert. Durch Hinzufügen von Index 3 wird eine Ausnahme ausgelöst. (Es wurde getestet)
Houssem Chlegou
0

Wenn Sie die Android- Variante von Java verwenden, kann ich die Verwendung eines SparseArray vorschlagen . Es ist eine speichereffizientere Zuordnung von Ganzzahlen zu Objekten und einfacher zu durchlaufen als eine Zuordnung

AllDayAmazing
quelle
0

Etwas spät, kann aber hoffentlich immer noch für jemanden nützlich sein.

2 Schritte zum Hinzufügen von Elementen zu einer bestimmten Position in einem ArrayList

  1. add Nullelemente für einen bestimmten Index in einem ArrayList
  2. Dann setdie Positionen nach Bedarf.

        list = new ArrayList();//Initialise the ArrayList
    for (Integer i = 0; i < mItems.size(); i++) {
        list.add(i, null); //"Add" all positions to null
    }
       // "Set" Items
        list.set(position, SomeObject);

Auf diese Weise haben Sie keine redundanten Elemente in der ArrayListdh, wenn Sie Elemente wie z.

list = new ArrayList(mItems.size());    
list.add(position, SomeObject);

Dies würde vorhandene Elemente in der Position nicht nur überschreiben und vorhandene Elemente um eins nach rechts verschieben. Sie haben also eine ArrayList mit doppelt so vielen Angaben.

Zain
quelle
0

Sie sollten festlegen, anstatt hinzuzufügen, um den vorhandenen Wert am Index zu ersetzen.

list.add(1, object1)
list.add(2, object3)
list.set(2, object2)

Die Liste enthält [Objekt1, Objekt2]

Saurabh
quelle