目前我正在使用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的子类并覆盖一些方法。我当然想知道是否有更优雅的方式这样做。
答案 0 :(得分:6)
您的要求是矛盾的:
......我需要在特定位置插入新元素。
我需要在大于当前尺寸的位置输入元素。
这意味着职位稳定;即,给定位置的元素保持在该位置。
我希望现在在索引1而不是索引0处找到“hi”。
这表明在某些情况下职位不稳定。
你真的需要决定你需要的替代方案。
如果您必须有稳定的职位,请使用TreeMap
或HashMap
。 (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);
但是,重要的是您需要首先确定总大小,这仅是一个注释,但我没有太多声誉。