是否有满足以下要求的Java数据结构?
get(i)
)get()
& contains()
种方法Comparator
强制执行)我在Oracle's JDK
或Guava
中找不到任何可以开箱即用的上述功能
List
提供索引访问权限&某种排序,但不是恒定时间contains()
。 SortedSet
和SortedMap
提供常量时间contains()
和排序但不提供索引访问!!
我是否遗漏了某些内容,或者是否存在可以操作以提供上述功能的数据结构?
我目前的解决方案:
HashMap
&的组合ArrayList
=>我使用ArrayList
来存储提供索引访问的已排序键,并使用HashMap
用于常量contains()
方法。我只是想确保我不是要重新发明已经完成的东西
为什么我需要这个:
让我们调用此数据结构SortedDataStore
我正在开发一款Android app&其中大部分UI都是项目列表,这些项目都是从本地数据库中提取的。 (本地数据库从远程服务器获取其数据)。使用RecyclerView
填充UI,我需要进行常量索引访问以从SortedDataStore
获取对象并填充视图。由于项目的顺序是根据其属性决定的,因此需要进行排序。此外,数据也会大量更新(项目被修改,删除并添加新项目)。当新数据进入时,我会检查我的SortedDataStore
是否应该删除,或者添加或修改(并转移到另一个索引),我需要这个时间contains()
&可变性。
答案 0 :(得分:4)
ArrayList
似乎在实践中实际上很好 - 您的数据不够大,线性时间因素对此非常重要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如果您使用索引作为密钥,则可以满足您的要求。
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();
get(i)
和get(i)
注意
如果要使用自定义比较器,请在子对象的类上扩展containsKey()
接口和Comparable
@Override
方法。