为什么这个hashmap有两次相同的密钥?

时间:2012-09-11 07:54:53

标签: java hashmap key duplicates

// 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 );
    }   

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 :  analyzeSrc.TextInfo@4c5 75.307 603.85535

WTFcontainsKey :  analyzeSrc.TextInfo@4c5 71.74238 603.85535

WTFcontainsKey :  analyzeSrc.TextInfo@4c4 66.36187 612.82837

...

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

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

3 个答案:

答案 0 :(得分:4)

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

查看Object.hashCode()的文档和Object as a Superclass

中的Java Tutorial部分

甚至更好:阅读Effective Java (2nd Ed) by Joshua Bloch

答案 1 :(得分:4)

如果没有看到完整的代码,很难知道,但我确信您的TextInfo课程没有正确实施equals()hashCode()。实现这两种方法是在HashMap中作为密钥有用的先决条件。

答案 2 :(得分:0)

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