只保存密钥的数据结构(不关心价值)

时间:2012-03-02 21:16:07

标签: java data-structures map hashmap

我需要存储一个字符串列表,并且需要检查列表中是否存在字符串。

我通常会使用一些带有键和布尔值的Map ...即

HashMap map<String,Boolean> = new HashMap<String,Boolean)()

只需做一个map.contains(string)

这是我过去总是进行这种查找的方式,因为我知道使用地图将是O(1)访问。

我知道这可能是挑剔和不重要的,但我只是好奇是否有一些结构可以保存那个布尔值。只是浪费记忆,因为我不关心错误的价值,因为如果关键不存在等同于假。

我在考虑将关键字指向null会做我想要的,但我想知道是否有某种数据结构可以做到这一点。

5 个答案:

答案 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>它有包含方法和其他所有内容......