如何在特定位置的ArrayList中插入对象


77

假设我有一个大小为n的对象的ArrayList。现在,我想在特定位置插入另一个对象,比方说在索引位置k(大于0且小于n),并且我希望索引位置k处及之后的其他对象向前移动一个索引位置。因此,有什么方法可以直接在Java中执行此操作。实际上,我想在添加新对象时保持列表排序。

Answers:


149

插入的特定索引,使用值到ArrayList中:

public void add(int index, E element)

此方法将移动列表的后续元素。但是您不能保证列表将保持排序状态,因为您插入的新对象可能会根据排序顺序位于错误的位置。


要在指定位置替换元素,请使用:

public E set(int index, E element)

此方法用指定的元素替换列表中指定位置的元素,并返回先前在指定位置的元素。


但我认为它将替换该索引位置的对象
Harshveer Singh 2011年

9
@Harsh实际上没有什么可考虑的-文档对此方法的下载内容非常具体
。oracle.com/ javase /

1
@Harsh替换您可以使用set(int index,Object Obj)
学习者

1
排序有什么问题?“根据插入顺序,您插入的新对象可能位于错误的位置”,因此,如果我将数组列表从0移到找到正确的插入位置,然后将其插入,列表的右侧将一个移至对...为什么订单中断?PS Java
流口水

请注意,这add()是可选的,这意味着并非通常不是所有Java实现的对象ArrayList也不List一定支持此方法。
EntangledLoops

71

这是在特定索引处插入的简单arraylist示例

ArrayList<Integer> str=new ArrayList<Integer>();
    str.add(0);
    str.add(1);
    str.add(2);
    str.add(3); 
    //Result = [0, 1, 2, 3]
    str.add(1, 11);
    str.add(2, 12);
    //Result = [0, 11, 12, 1, 2, 3]

7
我更喜欢这个答案,因为它显示了调用的结果。
aroth

2

请注意,当您在某个位置插入列表时,实际上是在列表的当前元素内的动态位置插入。看这里:

http://tpcg.io/0KmArS

package com.tutorialspoint;

import java.util.ArrayList;

public class ArrayListDemo {
   public static void main(String[] args) {

      // create an empty array list with an initial capacity
      ArrayList<Integer> arrlist = new ArrayList<Integer>(5);

      // use add() method to add elements in the list
      arrlist.add(15, 15);
      arrlist.add(22, 22);
      arrlist.add(30, 30);
      arrlist.add(40, 40);

      // adding element 25 at third position
      arrlist.add(2, 25);

      // let us print all the elements available in list
      for (Integer number : arrlist) {
         System.out.println("Number = " + number);
      }  
   }
}

$ javac com / tutorialspoint / ArrayListDemo.java

$ java -Xmx128M -Xms16M com / tutorialspoint / ArrayListDemo

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 15, Size: 0
    at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:661)
    at java.util.ArrayList.add(ArrayList.java:473)
    at com.tutorialspoint.ArrayListDemo.main(ArrayListDemo.java:12)



0

即使问题得到了解释清楚的答案,
也有一些重要的观点。

  1. 添加到特定位置时,必须自己处理ArrayIndexOutOfBounds。
  2. 如果您经常对大型数据集使用此操作,则使用LinkedList效率会更高。

对于ArrayList,boolean add(int index, E)创建一个新数组并复制旧数组中的所有内容。
它花费O(n)时间,与链接列表的摊销O(1)相比,这是大数据集的显着差异。

最后,为方便起见,您可以在Kotlin中使用此扩展功能

/**
 * Adds an [element] to index [index] or to the end of the List in case [index] is out of bounds
 */
fun <T> LinkedList<T>.insert(index: Int, element: T) {
    if (index <= size) {
        add(index, element)
    } else {
        add(element)
    }
}

-1

例如:

我想将arrayList中的元素从23th移到1th(索引== 0),所以我将23th元素放入一个临时值,然后从列表中删除,将其插入列表中的1th。它是可行的,但效率不高。

 List<ItemBean> list = JSON.parseArray(channelJsonStr,ItemBean.class);
    for (int index = 0; index < list.size(); index++) {
        if (list.get(index).getId() == 23) { // id 23
            ItemBean bean = list.get(index);
            list.remove(index);
            list.add(0, bean);
        }
    }

-1

此方法将指定的元素追加到此列表的末尾。

add(E e) //append element to the end of the arraylist.

此方法将指定的元素插入此列表中的指定位置。

void add(int index, E element) //inserts element at the given position in the array list.

此方法用指定的元素替换此列表中指定位置的元素。

set(int index, E element) //Replaces the element at the specified position in this list with the specified element.
      

      
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.