我需要一个具有快速索引和哈希访问权限的集合类。
现在我有了ArrayList。它具有良好的索引访问权限,但他的contains
方法不具备性能。 HashSet具有良好的contains
实现,但没有索引访问。哪个系列都有?可能来自Apache的东西?
或者我应该创建自己的集合类,它具有:用于索引访问的ArrayList和用于contains
检查的HashSet?
只是为了澄清:我需要get(int index)
和contains(Object o)
答案 0 :(得分:1)
如果索引访问性能不是问题,最接近的匹配是LinkedHashSet,其API表示它是
Set接口的哈希表和链表实现,具有可预测的迭代顺序。
至少我不认为性能会比LinkedListPerformance更差。否则我看不到除了你的ArrayList + HashTable解决方案之外别无选择
答案 1 :(得分:0)
如果您从头到尾遍历索引,我认为这可能满足您的需求:LinkedHashSet
如果您需要通过索引随机访问,以及哈希访问,如果没有其他人有更好的建议,我猜你可以制作自己的集合同时执行这两项工作。
答案 2 :(得分:0)
这样做;使用哈希技术以及列表的组合来充分利用这两个方面:)
class DataStructure<Integer>{
Hash<Integer,Integer> hash = new HashMap<Integer, Integer>();
List<Integer> list = new ArrayList<Integer>();
public void add(Integer i){
hash.add(i,i);
list.add(i);
}
public Integer get(int index){
return list.get(index);
}
...
} //used Integers to make it simpler
所以对象;你保留在 HashMap / HashSet 以及 ArrayList 。
所以如果你想使用
contains method : call hashed contains method.
get an object with index: use array to return the value
确保您同时拥有这两个集合。并负责两个数据结构中的更新/删除。
答案 3 :(得分:0)
我不知道确切的查找时间,但也许你可以使用Map interface的一些实现。您可以使用map.put(objectHash, obj)
存储对象。
然后你可以验证你有一个特定的对象:
boolean contained = map.containsValue(obj);
您可以使用哈希来查找地图中的对象:
MyObject object = map.get(objectHash);
尽管如此,唯一的缺点是您需要知道此查询调用中的哈希值,这可能不在您的实现中。