5

目前我正在使用 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 不满足我的第二个标准。任何帮助将不胜感激。

PS 性能现在不是真正的问题。

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

4

5 回答 5

7

你的要求是矛盾的:

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

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

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

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

这表明在某些情况下头寸不稳定。

你真的需要决定你需要哪种选择。

  • 如果您必须有稳定的位置,请使用 aTreeMapHashMap。(ATreeMap允许您按顺序迭代键,但代价是插入和查找成本更高……对于大型集合。)如有必要,请使用允许您“始终”生成新的“位置”键类型任何现有密钥对之间的密钥。

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

我看不出如果插入超出末端位置保持稳定是明智的,如果插入中间则允许不稳定。(此外,后者最终会使前者不稳定......)

于 2012-05-17T04:41:59.457 回答
3

即使您可以使用 TreeMap 来维护键的顺序。

于 2012-05-17T04:29:33.360 回答
2

首先,我会说使用Map而不是列表。我想如果您使用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");
于 2012-05-17T04:41:09.317 回答
0

使用 Vector 类来解决这个问题。

向量向量 = 新向量(); 矢量.setSize(100);

向量.set(98, "a");

当“setSize”设置为 100 时,所有 100 个元素都将被初始化为空值。

于 2014-02-06T10:47:27.930 回答
0

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

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

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

但问题是您需要首先确定总大小,这应该只是一个评论,但我没有太多的声誉来做到这一点。

于 2018-08-27T14:33:42.920 回答