2012-09-11 83 views
1
// same X, Y value text. 
    TextInfo currXY = new TextInfo(text); 

    ArrayList<TextPosition> currTextArray = textComposition.get(currXY); 
    if(currTextArray != null){ 
     currTextArray.add(text); 
    } else { 
     ArrayList<TextPosition> newTextArray = new ArrayList<TextPosition>(); 
     newTextArray.add(text); 
     if(textComposition.containsKey(currXY)){ 
      System.out.println("processTextPosition : containsKEy "); 
     } 
     textComposition.put(currXY , newTextArray); 
    } 

A HashMap不能有重复或相同的密钥对吗?为什么这个hashmap有两次相同的密钥?

我从hashmap中获取所有条目,并将这些条目放入一个新的hashmap中。

它继续像相同的密钥。

lineSortingMap = new HashMap< TextInfo, ArrayList<TextPosition> >();  
    for (Map.Entry< TextInfo, ArrayList<TextPosition> > entry : textComposition.entrySet()) { 
     TextInfo key = (TextInfo)entry.getKey(); 
     ArrayList<TextPosition> arrayTextPositions = entry.getValue(); 
     if(lineSortingMap.containsKey(key)){ 
      System.out.println("WTFcontainsKey : " + " " + key + " " + key.getX() + " " + key.getY()); 
     } 
     else{ 
      lineSortingMap.put(key , arrayTextPositions); 
     } 
    } 

结果:

WTFcontainsKey : [email protected] 75.307 603.85535 

WTFcontainsKey : [email protected] 71.74238 603.85535 

WTFcontainsKey : [email protected] 66.36187 612.82837 

... 

你能解释这里发生了什么?

为什么不打印“processTextPosition:containsKey”?

回答

4

可能是因为您的Key Object不能正确覆盖equals()和hashCode()。

Object.hashCode()的文档,并从Java Tutorial

甚至更​​好的科Object as a Superclass:阅读Effective Java (2nd Ed) by Joshua Bloch

+1

@JoachimSauer令人惊讶的是Sun/Oracle官方文档中强调了这一点。 Java教程的Maps部分和HashMap JavaDocs几乎没有提到一致的equals()/ hashCode()实现的重要性。 –

+0

我的印象是很多API文档都是从受正式系统影响的视图写成的(“你是什么意思?”equals()'/'hashCode()你不遵循他们的系统是FUBAR,是不是很明显?“),而不是真实世界的文档(”注意,如在这个和这个位置记录,你**必须确保.. .. “)。 –

+0

谢谢你的回答:)我重写equals()和hashCode()。但我不明白,当第一次调用containsKey方法,它返回false ...接下来,我移动该hashmap的条目,但这次containsKey方法返回true – hanbumpark

4

很难知道没有看到完整的代码,但我有理由相信,你TextInfo类没有正确实施equals()hashCode()。实施这两种方法是作为HashMap中的关键字有用的先决条件。

+0

谢谢你的回答:) 我重写equals()和hashCode()。但我不明白,当第一次调用containsKey方法时,它返回false ...下一步我移动该散列映射的条目,但这次containsKey方法返回true ... – hanbumpark

+1

@HanbumBak:你是如何实现它的?向我们展示代码,因为这是该问题最可能的来源。 –

+0

我解决了这个问题。 :) – hanbumpark

0

对于使用您创建的对象作为Map中的键,您应该覆盖hashCode()equals()方法。我很确定你的班级TextInfo没有提供相同的实施。

相关问题