【问题标题】:Data structure to hold just keys (not caring about value)只保存键的数据结构(不关心值)
【发布时间】:2012-03-21 09:07:46
【问题描述】:

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

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

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

然后做一个map.contains(string)

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

我知道这可能很挑剔且不重要,但我只是好奇是否有某种结构可以保存该布尔值。似乎是在浪费内存,因为我不关心 false 值,因为如果键不存在就等于 false。

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

【问题讨论】:

    标签: java data-structures map hashmap


    【解决方案1】:

    这就是 Set&lt;T&gt; 集合的用途。 HashSet&lt;T&gt; 实现是 O(1),并且在内部执行您的建议:这是一个 HashMap&lt;T,V&gt;,其中每个键的值是相同的内部 Object 实例。即源中包含

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();
    

    每个条目的值都设置为PRESENT

    【讨论】:

    • 很有趣,所以假设使用具有空值的哈希图会提高性能?
    • @K2xL 为什么使用具有空值的哈希图会改变性能?
    • 它不是一个值为空的 HashMap。值为对象。
    • @chicout 感谢指正;我已经相应地更新了答案。
    【解决方案2】:

    也许是HashSet&lt;E&gt;

    或者实际上,任何实现 Set&lt;E&gt; 的东西,尽管它们并不都有 O(1) 的预期查找。

    【讨论】:

      【解决方案3】:

      HashSet(或)其他 Set 接口实现可能会为您提供您正在寻找的功能。

      【讨论】:

        【解决方案4】:

        你应该使用HashSet&lt;E&gt; - “数据结构只保存键(不关心值)”。它的实现基于HashMap&lt;K,V&gt;,其中每个元素都是一个值,而键只是对象,正是您所需要的。

        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;
            }
        
            ...
        }
        

        【讨论】:

          【解决方案5】:

          为什么不使用通常的ArrayList&lt;String&gt; 它有包含方法和其他所有东西......

          【讨论】:

          • 这会使向列表中添加关键字需要很长时间
          • @K2xL - 不,添加到(未排序的)列表是 O(1),但包含操作是 O(n)。
          • @Andreas_D 好吧,我应该更具体一些,但是当内部结构的大小达到其限制(并且您添加另一个项目)时,Arraylists 必须重新分配。但是是的,contains 方法需要 O(n)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多