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

我认为这是一个相当简单的问题,但我不知道如何正确地做到这一点。

我有一个空的数组列表:

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

我想要添加一些对象,每个对象都必须位于某个位置。 但是,必须按照可能的顺序添加。 当我尝试这个,它不起作用,我得到一个IndexOutOfBoundsException

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

我所尝试的是填充ArrayListnull ,然后执行上述操作。 它有效,但我认为这是一个可怕的解决scheme。 有没有另外一种方法来做到这一点?

你可以这样做:

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

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

如果你希望object3始终处于position3,我build议你使用一个HashMap,位置是key,object是value。

您可以使用对象数组并将其转换为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]

如果是这样的话,为什么你不考虑使用一个常规的数组,初始化容量,并把对象放在你想要的索引。

 Object[] list = new Object[10]; list[0] = object1; list[2] = object3; list[1] = object2; 

您也可以重写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

我将注意力放在ArrayList.add文档上 ,该文档说它抛出IndexOutOfBoundsException – 如果索引超出范围( index < 0 || index > size()

在调用list.add(1, object1)之前检查列表的size() list.add(1, object1)

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

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

这个小循环作为解决scheme呢?

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

我认为medopal的解决scheme就是你正在寻找的。

但是另一个可选的解决scheme是使用HashMap并使用键(Integer)来存储位置。

这样你就不需要用null来填充它,只要在地图上粘贴位置和对象就行了。 如果你需要这样的话,你可以在最后写几行来把它转换成List。

这是一个可能的解决scheme:

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

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

有点晚了,但希望仍然可以有用的人。

2步将项目添加到ArrayList的特定位置

  1. add空项addArrayList的特定索引
  2. 然后set需要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); 

这样你就不会在ArrayList有多余的项目,也就是说,如果你要添加诸如

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

不会覆盖位置上的现有项目,而是将现有的项目向右移动一个 – 所以您的ArrayList具有两倍的标记。

您应该设置而不是添加来replace索引处的现有值。

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

列表将包含[object1,object2]