我正在寻找像ArrayList
这样的数据结构,在从中删除单个元素后,这些元素不会重新编制索引。
作为一个示例场景,请考虑使用以下列表 psoudocode :
A(0) = m
A(1) = n
A(2) = o
A(3) = p
A(4) = q
使用ArrayAdapter
,发出A.remove(2)
会导致:
A(0) = m
A(1) = n
A(2) = p // index decremented
A(3) = q // index decremented
这不是我想要的行为。我正在寻找一个列表/数组/地图/集合/集合/其他任何给出这样的结果:
A(0) = m
A(1) = n
A(3) = p // index persisted
A(4) = q // index persisted
它可以使用整数计数器和Map
组合完成,但我想知道是否已有更清洁的解决方案。
使用Map和整数计数器的脏方法:
HashMap<Integer, Object> map = new HashMap<>();
int indexCounter = 0;
public void insertItem(Object o){
map.put(indexCounter, o);
indexCounter++;
}
有什么想法吗?
编辑:
要清除,m, n, o, ...
我的意思是不同的价值观。这些不一定是字符串,可以是任何类型的对象。那是伪代码。
更重要的是,在我的情况下,使用NULL或模拟值不是一个选项。虽然,我正在寻找一个通用的解决方案,而不是针对我的情况。感谢分享btw。
编辑2: 实际上,我在寻找数据结构,而不是黑客或技巧。因此,如果Java中没有提供这样的东西,那么这个问题的正确答案将是一个直截了当的结论“不,没有这样的事情。”
答案 0 :(得分:1)
&#34;实际上,我正在寻找一种数据结构,而不是黑客或技巧。&#34;
这不是一个有效的区别,除非你可以定义一个&#34;数据结构&#34;和一个&#34; hack&#34;或&#34;技巧&#34;。
在你的例子中,你说数据结构/ API /无论如何,删除第3个元素后需要给你以下内容:
A(0) maps to m
A(1) maps to n
A(3) maps to p
A(4) maps to q
但是,如果有人询问A(2)
映射的内容,那么您不会说的是应该发生什么。有多种可能的答案,但最合理的是:
null
String
;例如""
所有这些都可以使用Map<Integer, String>
的薄包装来表示,其中键是元素索引。您可以使用HashMap
或TreeMap
,具体取决于此数据结构的其他要求。
另一种方法是使用Android的SparseArray
课程。这类似于从int
到Object
的地图,但它没有实现标准的Map
API。这使得他们可以使用比使用HashMap
或TreeMap
更紧凑的表示。
在幕后,SparseArray
使用int
和Object
的成对数组。它安排int
值被排序,以便可以使用简单的二进制搜索来搜索它们。缺点是查找为O(log N)
,插入可以为O(N)
。 (查看Android源代码以获取详细信息。)
答案 1 :(得分:0)
您可以创建自己的方法,将特定索引处的值替换为空字符串...
public void resetA_AtIndex(int index)
{
A.remove(index);
A.add(index, "");
}
答案 2 :(得分:0)
我建议使用LinkedList来解决你的目的,不会影响删除像ArrayList这样的元素的性能。
您可以查看此链接,了解它是否满足您的需求 https://dzone.com/articles/linked-list-journey-continues