【问题标题】:What is inside an empty index of a Hashmap?Hashmap 的空索引里面是什么?
【发布时间】:2010-07-22 12:26:11
【问题描述】:

我有一个大小为 101 个键的哈希图,但我确定其中大约 6 个没有数据,而且可能还有更多没有数据。空索引里面到底是什么?它是空的吗?还是有一个 Hash(index).isEmpty() 方法可以用来查看它是否为空?

我意识到 hashmap 中有一个 isEmpty 方法,但我认为只检查整个地图是否为空,而不仅仅是单个索引。

【问题讨论】:

  • 你能用调试器检查这些“空”元素吗?我仍然不清楚你在问什么。
  • 如果您的问题是关于 HashMap 类如何在内部工作:您可以在 JDK 安装目录中的 src.zip 中查找源代码。
  • 问题基本上是如果您创建一个大小为 10 的哈希图,但您只将 4 个对象放入其中。如果您正在运行一个循环来检查您的哈希映射,其中这 4 个对象被映射到您将如何检查哪些键是空的以及哪些键内部有数据,因为 isEmpty 方法仅适用于整个映射而不是特定键。我很早就想出了如何解决它,但我一直在努力解决这个问题。

标签: java hashmap


【解决方案1】:

我意识到有一个 isEmpty 方法 在哈希图中,但我认为 仅检查整个地图是否 空的不仅仅是一个索引。

我认为您正在寻找的是containsKey(Object) method。根据文档:

如果此映射包含一个 指定键的映射。更多的 正式地,当且仅当返回true 此映射包含键的映射 k 这样(key==null ? k==null : key.equals(k))。 (最多可以有 一个这样的映射。)

参数:

key - 待测试在此映射中存在的键

返回:

true 如果此映射包含指定键的映射

【讨论】:

    【解决方案2】:

    好吧,要让钥匙在没有数据的情况下到达那里,你必须在那里put他们。

    如果您执行了map.put(key, null),那么是的,该键的数据是null。你总是必须给方法第​​二个参数,你不能只是map.put(key)。

    如果您确定某个键不应该有数据,您可以尝试进入调试模式并监视myMap.get(myEmptyKey) 并查看您得到了什么(如果没有数据是空对象或其他东西,你应该能看到)。

    编辑:一些代码会对您有所帮助,但如果我理解正确,您可以这样做:

    for (Object obj : list) {
        if (matchesCriteriaX(obj)) {
             map.put("X", obj);
        else if (matchesCriteriaY(obj)) {
             map.put("Y", obj);
        }
    }
    

    好吧,如果您这样做并尝试执行map.get("X"),但您实际上从未为该键添加任何内容(因为没有对象匹配条件X),您肯定会得到null。

    另一方面,如果你做了类似的事情

    Map<String, List<Object>> map = new HashMap<String, List<Object>>();
    map.add("X", new ArrayList<Object>());
    map.add("Y", new ArrayList<Object>());
    for (Object obj : list) {
        if (matchesCriteriaX(obj)) {
             List<Object> list = map.get("X");
             list.add(obj);
        else if (matchesCriteriaY(obj)) {
             List<Object> list = map.get("Y");
             list.add(obj);
        }
    }
    

    然后您可以通过 map.get("x").isEmpty() 来检查一个类别是否为空,因为 List 具有该方法(如果没有对象匹配关键条件,它将为空)。

    【讨论】:

    • 好吧,基本上,我的应用程序正在从数据库中读取 3300 个产品,然后根据某些标准将它们映射到散列中的不同键,所以我知道有几个是空的,但是因为我正在使用外部散列 我知道由于未满足所有标准,因此有几个键将为空。因此,当我运行一个循环将所有这些添加到我的树中时,我试图弄清楚如何跳过空键并继续下一个。
    • "A couple of keys will be empty",这是什么意思?这是否意味着这些键没有关联的值,如果是这样,那么您首先是如何将它们添加到 hashmap 中的?
    • 是的,您的第一个基本示例是我所做工作的简短版本。一切顺利,感谢您的帮助。
    • @SomeoneRandom:除了使用Map&lt;String, List&lt;Object&gt;&gt;,您还可以使用来自Google Collections Framework 的Multimap&lt;String, Object&gt;(现在是Guava library 的一部分)。
    【解决方案3】:

    从你所说的来看,我怀疑是这样的:

    Map<SomeKey, List<SomeValue>> yourMap;
    

    如果是这样的话,你能做的就是

    if( yourMap.contains(someKey) ){
        List<SomeValue> someList = yourMap.get(someKey);
        if(someList.size() == 0){
            // it's empty, do something?
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多