删除时具有稳定索引的Java Array / List

时间:2017-11-15 11:06:06

标签: java android list dictionary arraylist

我正在寻找像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中没有提供这样的东西,那么这个问题的正确答案将是一个直截了当的结论“不,没有这样的事情。”

3 个答案:

答案 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>的薄包装来表示,其中键是元素索引。您可以使用HashMapTreeMap,具体取决于此数据结构的其他要求。

另一种方法是使用Android的SparseArray课程。这类似于从intObject的地图,但它没有实现标准的Map API。这使得他们可以使用比使用HashMapTreeMap更紧凑的表示。

在幕后,SparseArray使用intObject的成对数组。它安排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