在大于当前大小的位置将元素添加到ArrayList中

时间:2012-05-17 04:23:52

标签: java data-structures

目前我正在使用ArrayList来存储元素列表,因此我需要在特定位置插入新元素。我需要在大于当前大小的位置输入元素。例如:

ArrayList<String> arr = new ArrayList<String>();
arr.add(3,"hi");

现在我已经知道会有一个OutOfBoundsException。还有其他方式或其他对象我可以在保持订单的同时做到这一点吗?这是因为我有方法根据索引查找元素。例如:

ArrayList<String> arr = new ArrayList<String>();
arr.add("hi");
arr.add(0,"hello");

我希望现在在索引1而不是索引0处找到“hi”。
总而言之,如果不能手动将null插入到中间的元素中,有没有办法满足这两个要求:

  • 将元素插入大于当前大小的位置
  • 当我在列表中间插入元素时,将现有元素推向右侧

我查看了Java ArrayList add item outside current size以及HashMap,但HashMap不符合我的第二个标准。任何帮助将不胜感激。

P.S。性能现在不是一个真正的问题。

更新:对于为什么我有这些特殊要求存在一些问题,这是因为我正在进行操作转换,我将一组操作插入到我的列表(数学公式)中。每个操作都包含一个字符串当我在列表中插入/删除字符串时,我将通过跟踪已经应用的每个操作来动态更新未应用的操作(如果需要)。我现在的解决方案是使用ArrayList的子类并覆盖一些方法。我当然想知道是否有更优雅的方式这样做。

5 个答案:

答案 0 :(得分:6)

您的要求是矛盾的:

  

......我需要在特定位置插入新元素。

     

我需要在大于当前尺寸的位置输入元素。

这意味着职位稳定;即,给定位置的元素保持在该位置。

  

我希望现在在索引1而不是索引0处找到“hi”。

这表明在某些情况下职位不稳定。

你真的需要决定你需要的替代方案。

  • 如果您必须有稳定的职位,请使用TreeMapHashMap。 (A TreeMap允许您按顺序迭代键,但代价是更昂贵的插入和查找...对于大型集合。)如有必要,使用“位置”键类型,允许您“始终“生成一个介于任何现有密钥之间的新密钥。

  • 如果您没有稳定的职位,请使用ArrayList,并使用append处理必须插入结束位置的情况。

如果插入到最后,我看不出位置是否稳定是合理的,如果插入中间则允许不稳定。 (此外,后者最终会使前者变得不稳定......)

答案 1 :(得分:3)

即使您可以使用TreeMap维护密钥的顺序。

答案 2 :(得分:2)

首先,我会说使用Map代替List。我想如果使用Map,可以更好地解决问题。但无论如何,如果你真的想用Arraylist

来做这件事
        ArrayList<String> a = new ArrayList<String>(); //Create empty list
        a.addAll(Arrays.asList( new String[100]));  // add n number of strings, actually null . here n is 100, but you will have to decide the ideal value of this, depending upon your requirement.
        a.add(7,"hello");
        a.add(2,"hi");
        a.add(1,"hi2");

答案 3 :(得分:0)

使用Vector类解决此问题。

Vector vector = new Vector(); 的 vector.setSize(100);

vector.set(98,“a”);

当“setSize”设置为100时,所有100个元素都会使用空值进行初始化。

答案 4 :(得分:0)

对于那些仍在处理此问题的人,您可以这样做。

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

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

但是,重要的是您需要首先确定总大小,这仅是一个注释,但我没有太多声誉。