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

Posted

技术标签:

【中文标题】将对象添加到指定索引处的 ArrayList【英文标题】:Add object to ArrayList at specified index 【发布时间】:2011-11-15 03:23:59 【问题描述】:

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

我有一个空数组列表:

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

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

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

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

【问题讨论】:

你得到一个 IndexOutOfBoundsException 因为列表是空的并且你不能访问一个不存在的列表位置... 有没有办法在不使用空对象填充列表的情况下创建该位置?对我来说,这似乎是一个非常奇怪的解决方案。 我不这么认为...如果您需要以随机顺序添加对象,则必须寻找另一种方法。例如,使用典型数组:' Object[]' 然后你不应该填充它,只需初始化 @Maethortje 这并不是一个奇怪的问题。查找稀疏列表,reference.wolfram.com/mathematica/tutorial/… 似乎是一篇好文章。不过在 Java 中,以索引为键的 Map 可能是最简单的方法。 @Pan 即使你声明了大小。它只是不初始化列表,而是声明你想在内存中保留多少空间。在我看来,列表是一个数组元素也有指向下一个元素的指针。如果您在第二个为空(或 null)时尝试将元素添加到第三个位置,则没有指针可以帮助您知道它是第三个元素..:1->2->3 可以,但是 1- >*->3 这里你有问题... 【参考方案1】:

假设你想在某个位置添加一个项目,那么列表大小必须大于该位置。

add(2, item):这个语法的意思是,将位置 2 的旧项目移动到下一个索引,并添加第二个位置的项目。

如果第二个位置没有项目,那么这将不起作用,它会抛出异常。

这意味着如果你想在position 2,添加一些东西

您的列表大小必须至少为(2 + 1) =3,,以便在0,1,2 Position. 上提供这些项目

这样就保证了位置2可以安全访问,不会有异常。

【讨论】:

当我通知您的答案时我只是路过...实际上,索引必须低于或等于我们插入时列表的实际长度新物品。示例:列表大小为 2:添加索引 2 将起作用。添加索引 3 将引发异常。 (经过测试)【参考方案2】:

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

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

列表将包含 [object1,object2]

【讨论】:

【参考方案3】:

有点晚了,但希望对某人仍然有用。

将项目添加到ArrayList 中的特定位置的两个步骤

    add 空项目到 ArrayList 中的特定索引

    然后在需要时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。

【讨论】:

【参考方案4】:

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

Object[] list = new Object[10];

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

【讨论】:

你初始化了容量,而不是'ArrayList'的大小。大小定义为元素的数量,当索引为 > 大小时,异常出现... @Vic,我起初误读了这个问题,但感谢您的提示。 我将容量初始化为10,但添加对象时仍然得到IndexOutOfBoundsExceptopn。与使用 ensureCapacity 更改容量相同。目前唯一有效的是用 null 填充...... @Maethortje 寻找“大小”和“容量”之间的区别......当索引>大小时出现异常,而不是>容量...... 正如那些人提到的,您在索引 3 处添加一个对象,而列表的大小仍然是 1。这是不可能的。只要此索引在列表边界内,就允许在特定索引处添加,例如,如果您的列表有 3 个对象,则不能在索引 100 处添加对象。【参考方案5】:

如果您使用的是 android 风格的 Java,我建议您使用 SparseArray。它是一种更节省内存的整数到对象的映射,并且比 Map 更容易迭代

【讨论】:

【参考方案6】:

您还可以覆盖 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 中的任何位置添加。比如这个main方法:

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:空

4: 空

5:5

【讨论】:

注意!如果你把 a.add(3, "three"); 放在最后,第五个元素将被向前推。您将拥有:“6:5”【参考方案7】:

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

while (arraylist.size() < position)

     arraylist.add(null);


arraylist.add(position, object);

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

这个小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)

【讨论】:

【参考方案10】:

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

【讨论】:

一个缺点是你必须提前知道尺寸。【参考方案11】:

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

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

这样一开始你就不需要用空值等填充它,只需在你前进的过程中将位置和对象粘贴在地图中即可。如果需要,可以在末尾写几行将其转换为 List。

【讨论】:

TreeMap 不是按键排序更好吗?【参考方案12】:

你可以这样做:

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

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

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

【讨论】:

哈希图确实可以解决这个问题。我想我会选择那个,因为当位置 2 没有对象时,我似乎无法在位置 3 添加一些东西。 简短但最多的答案。其他人只是走错了路 建设性逻辑!【参考方案13】:
@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

*/

【讨论】:

我了解导致我的错误的问题。似乎我必须先将对象添加到后续位置,然后才能将对象添加到该位置。在我添加的那一刻,我并没有处理我想要添加的所有对象。你认为添加空对象是一个合适的解决方案吗? @Maethortje 这样做不太公平,因为它只是一个 hack :) 您需要从第一段中删除代码示例引号。【参考方案14】:

我提请您注意 ArrayList.add documentation,它表示它会抛出 IndexOutOfBoundsException - 如果索引超出范围 (index &lt; 0 || index &gt; size())

在致电list.add(1, object1) 之前,请检查列表中的size()

【讨论】:

你是对的@Hemal,@Maethortje 为什么在将元素添加到列表之前不检查列表的大小?检查您尝试添加的位置是否小于列表的大小,如果没有,那么您可以执行正常的list.add("element"); 据我了解,“问题”是在位置 3 添加元素,即使位置 2 没有元素... @Vis 这是一个稀疏列表——请参阅我对这个问题的评论。

以上是关于将对象添加到指定索引处的 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

集合

如何将一个 NSArray 的两个不同索引处的对象存储到另一个 NSArray 的一个索引

指定索引处的动态组件未正确放置

ArrayListVector

索引 0 处的 InsertItem - DoubleLinkedList

javascript 简单数组函数,用于从数组中删除指定索引处的元素。