在指定的索引处将对象添加到ArrayList

时间:2011-09-12 08:04:51

标签: java android arraylist

我认为这是一个相当简单的问题,但我无法弄清楚如何正确地做到这一点。

我有一个空的arraylist:

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

我想要添加一些对象,每个对象都必须处于某个位置。然而,必须以各种可能的顺序添加它们。当我尝试这个时,它不起作用,我得到一个IndexOutOfBoundsException

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

我尝试过的是ArrayList填充null然后执行上述操作。它有效,但我认为这是一个可怕的解决方案。还有另一种方法吗?

14 个答案:

答案 0 :(得分:194)

你可以这样做:

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

将object2添加到位置2后,它会将object3移动到位置3。

如果你希望object3始终位于position3,我建议你使用HashMap,其中position是key,object是value。

答案 1 :(得分:27)

您可以使用对象数组并将其转换为ArrayList -

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

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

ArrayList将是 - [1,null,2,3,null,null,null,7,null,null]

答案 2 :(得分:15)

如果是这种情况,那你为什么不考虑使用常规数组,初始化容量并将对象放在你想要的索引上。

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;

答案 3 :(得分:13)

您还可以覆盖ArrayList,以在您的大小和要添加的元素之间插入空值。

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);
    }
}

然后您可以在ArrayList中的任何位置添加。例如,这个主要方法:

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));
    }
}   

从控制台产生此结果:

0:零

1:一个

2:两个

3:null

4:null

5:5

答案 4 :(得分:9)

我提醒您注意ArrayList.add documentation,如果索引超出范围(IndexOutOfBoundsException

,它会抛出index < 0 || index > size()

在致电size()

之前,请检查列表的list.add(1, object1)

答案 5 :(得分:5)

您需要使用空值填充空索引。

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

arraylist.add(position, object);

答案 6 :(得分:2)

@Maethortje 

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

在尝试在指定位置添加元素时,您获得了IndexOutOfBound, 所以列表应该有一些元素在他们的位置。

请尝试以下

/*
  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

*/

答案 7 :(得分:2)

这个小while循环作为解决方案怎么样?

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)

答案 8 :(得分:2)

这是一个可能的解决方案:

list.add(list.size(), new Object());

答案 9 :(得分:1)

我认为medopal的解决方案正是您所寻找的。

但另一种替代解决方案是使用HashMap并使用密钥(Integer)来存储位置。

这样你最初就不需要用null等填充它,只需在你去的时候将位置和对象粘在地图上。如果你需要的话,你可以在最后写几行来将它转换为List。

答案 10 :(得分:1)

假设您要在某个位置添加项目,则列表大小必须大于该位置。

add(2, item):这种语法意味着将第2位的旧项目移到下一个索引,然后在第2位添加该项目。

如果在第二位置没有物品,则将无法正常工作,它将引发异常。

这意味着如果要在position 2,

添加

您的列表大小必须至少为(2 + 1) =3,,这样项目才能在0,1,2 Position.

可用

通过这种方式,可以确保安全访问位置2,并且不会出现异常。

答案 11 :(得分:0)

如果您使用的是Android的Java风格,我建议您使用SparseArray。它是一个更有效的内存映射整数到对象,比Map更容易迭代

答案 12 :(得分:0)

有点迟,但希望对某人有用。

将商品添加到ArrayList

中的特定位置的两个步骤
  1. add将项目归属为ArrayList
  2. 中的特定索引
  3. 然后set在需要时的位置。

        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);
    
  4. 这样您就不会在ArrayList中拥有多余的项目,例如,如果您要添加诸如

    之类的项目
    list = new ArrayList(mItems.size());    
    list.add(position, SomeObject);
    

    这将仅覆盖位置中的现有项目,将现有项目向右移动一次 - 因此您有一个ArrayList,其数量是指标的两倍。

答案 13 :(得分:0)

您应该设置而不是添加以替换索引处的现有值。

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

列表将包含[object1,object2]