【问题标题】:problem getting value from HashMap从 HashMap 获取值的问题
【发布时间】:2011-09-21 18:08:18
【问题描述】:

大家好,我正在使用 HashMap 来保存我的一个带有字符串键的对象。当我用键放置一个对象时,它没有问题,当我放置第二个对象时,我添加了我的对象,但无法用它的键获取它。某种程度上它去了“下一个”的某个地方。我在下面的调试模式(eclipse)中截取了截图

虽然 size 显示为 2,但我在 hashmap 中看不到我的第二项,但在其他 hashmap 的下一个节点中。

要注意我在“name.tag”形式中使用我的密钥,标签和名称不能同时相同,但“标签”可以相同。在评估键时,hashmap 是否与点运算符有关?我希望我能写清楚,

提前致谢

编辑: 这是我用来创建哈希图的一段代码

        private HashMap<String,ParameterItem> parseParametersNode(DataModel parent,Element element){
        NodeList parameterChilds=element.getChildNodes();//gep element parameters
        HashMap<String, ParameterItem> parameterItems=new HashMap<String, ParameterItem>();
        for(int i=0;i<parameterChilds.getLength();i++){
            if(parameterChilds.item(i).getNodeType()==Node.ELEMENT_NODE){
                Element el=(Element) parameterChilds.item(i);
                NamedNodeMap atts=el.getAttributes();
                ParameterItem item=new ParameterItem();

                for(int j=0;j<atts.getLength();j++){
                    Attr attribute=(Attr) atts.item(j);
                    String attributeValue=attribute.getValue();
                    String attributeName=attribute.getName();
                    item.setParsedProperty(attributeName, attributeValue);
            } /*check  attributes later*/
                //finish loop and insert paramitem to params
                String key="key"+i;
                if(item.getTag()!=null && item.getName()!=null)
                    key=item.getName()+"."+item.getTag();
                parameterItems.put(key, item);
//              testParam=item;
//              parameterItems.put(key, testParam);
                }
        }
        return parameterItems;

    }

【问题讨论】:

  • 向我们展示您添加从地图中删除的东西的代码
  • 您能否发布一些代码,特别是您如何将项目添加到地图以及如何获取项目。
  • 可能两个键都是equals
  • 我不认为与“。”有任何关系。在密钥中使用。分享您的代码以获取更多信息..
  • 我已经添加了一些代码@jigar:不,伙计,键不等于,但是像“a.123”这样的键之一,另一个是“b.123”我不认为有这个问题

标签: java collections hashmap


【解决方案1】:

这里没有真正的问题:你有一个hash collision。也就是说,您的两个密钥都已放置在同一个哈希桶中。看起来你只有四个桶(奇怪,我认为最初的默认值是 10 或 16),所以随机数据的可能性是 25%。你的尺寸增加了就好了。 next 是内部实现指向同一桶中的下一个元素的方式。如果每个桶中的元素数量太大,Java 会在内部 rehash 到更多桶中。

我不明白为什么在这里需要 HashTable,因为您是连续编号键(您可以使用 ArrayList),但也许这只是入门代码,您的实际用例不同。

【讨论】:

  • Java 的哈希函数使用链式解决冲突?我不知道,当第一次看到这个时,我想知道下一个是什么。应该建立这种联系。
  • 谢谢 Andrew,但你认为我之前添加的密钥没有值是正常的吗?你能提供一个讨论这个哈希桶和哈希图内部的链接吗?我使用增量密钥进行测试,或者以防其他密钥不存在
  • 不,如果你把它放进去,你应该可以把它拿出来。但我强烈怀疑您不小心使用了不同的键,或者您将 null 存储为与该键关联的值。您可以查看 Hashtable download.oracle.com/javase/6/docs/api/java/util/Hashtable.html 的 Javadoc 或 Wikipedia en.wikipedia.org/wiki/Hash_table
【解决方案2】:

你有代码:

String key="key"+i;

但在此之后您再次设置密钥而不添加它:

if(item.getTag()!=null && item.getName()!=null)
              key=item.getName()+"."+item.getTag();

这应该是键 +=item.getName()+"."+item.getTag(); ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多