Java数据结构:IndexedSet或HashList

时间:2015-03-24 17:53:46

标签: java data-structures guava

是否有满足以下要求的Java数据结构?

  1. 索引访问权限。 (即,我应该能够使用get(i)
  2. 检索对象
  3. 恒定时间get()& contains()种方法
  4. 应强制执行排序(由Comparator强制执行)
  5. 应该是可变的
  6. 我在Oracle's JDKGuava中找不到任何可以开箱即用的上述功能

    List提供索引访问权限&某种排序,但不是恒定时间contains()SortedSetSortedMap提供常量时间contains()和排序但不提供索引访问!!

    我是否遗漏了某些内容,或者是否存在可以操作以提供上述功能的数据结构?

    我目前的解决方案:

    HashMap&的组合ArrayList =>我使用ArrayList来存储提供索引访问的已排序键,并使用HashMap用于常量contains()方法。我只是想确保我不是要重新发明已经完成的东西

    为什么我需要这个:

    让我们调用此数据结构SortedDataStore 我正在开发一款Android app&其中大部分UI都是项目列表,这些项目都是从本地数据库中提取的。 (本地数据库从远程服务器获取其数据)。使用RecyclerView填充UI,我需要进行常量索引访问以从SortedDataStore获取对象并填充视图。由于项目的顺序是根据其属性决定的,因此需要进行排序。此外,数据也会大量更新(项目被修改,删除并添加新项目)。当新数据进入时,我会检查我的SortedDataStore是否应该删除,或者添加或修改(并转移到另一个索引),我需要这个时间contains()&可变性。

3 个答案:

答案 0 :(得分:4)

  • 根据您所描述的预期数据大小,ArrayList似乎在实践中实际上很好 - 您的数据不够大,线性时间因素对此非常重要
  • 否则,你正在做的是正确的解决方案;没有提供可变数据结构,可以同时完成所有这些。
  • 如果你能避免变异,那么Guava的ImmutableSet就能满足你的其他要求。您可以使用ImmutableSet.asList().get(index)在O(1)时间内按索引获取元素,否则它支持O(1)包含和插入顺序。

答案 1 :(得分:2)

ArrayList满足三个要求:

  • 使用get(int i)
  • 进行索引访问
  • 使用get(int i)
  • 进行恒定时间访问
  • 使用add(Object o)
  • 按插入顺序排列

答案 2 :(得分:0)

Java's LinkedHashMap如果您使用索引作为密钥,则可以满足您的要求。

  1. 索引访问:使用var selectedProductIds = cartList.Select(c => c.ProductId).ToList(); var selectedProducts = db.Products.Where(p => selectedProductIds.Contains(p.Id)).ToList(); var cart = cartList.GroupJoin(selectedProducts, c => c.ProductId, p => p.Id, (c, p)=> new Cart() { Product = p.First(), Quantity=c.Quantity}).ToList();
  2. 恒定时间get()和contains()方法:使用get(i)get(i)
  3. 应强制执行排序(由Comparator强制执行):请参见注释
  4. 应该是可变的:是

注意

如果要使用自定义比较器,请在子对象的类上扩展containsKey()接口和Comparable @Override方法。

comparator for LinkedHashMap