我需要存储一个字符串列表,并且需要检查列表中是否存在字符串。
我通常会使用一些带有键和布尔值的Map ...即
HashMap map<String,Boolean> = new HashMap<String,Boolean)()
只需做一个map.contains(string)
这是我过去总是进行这种查找的方式,因为我知道使用地图将是O(1)访问。
我知道这可能是挑剔和不重要的,但我只是好奇是否有一些结构可以保存那个布尔值。只是浪费记忆,因为我不关心错误的价值,因为如果关键不存在等同于假。
我在考虑将关键字指向null
会做我想要的,但我想知道是否有某种数据结构可以做到这一点。
答案 0 :(得分:5)
这是Set<T>
集合的用途。 HashSet<T>
实现是O(1),内部完成您的建议:它是HashMap<T,V>
,其中每个键的值是相同的内部Object实例。也就是说,源包含
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
并且每个条目的值都设置为PRESENT
。
答案 1 :(得分:4)
也许是HashSet<E>
?
或者实际上,任何实现Set<E>
的东西,尽管它们都没有O(1)预期的查找。
答案 2 :(得分:0)
HashSet(或)Someother Set接口实现可以为您提供所需的功能。
答案 3 :(得分:0)
您应该使用HashSet<E>
- “数据结构来保存密钥(不关心价值)”。它的实现基于HashMap<K,V>
,其中每个元素都是一个值,键只是对象,正是你需要的。
public class HashSet<E> ... {
...
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<E,Object>();
}
...
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
...
}
答案 4 :(得分:-1)
为什么不使用通常的ArrayList<String>
它有包含方法和其他所有内容......