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

AHashMap不能有重复或相同的密钥,对吗?

我从 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”?

4

3 回答 3

4

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

请参阅Java 教程中的文档Object.hashCode()和 Section Object as a Superclass

甚至更好:阅读Joshua Bloch 的 Effective Java(第二版)

于 2012-09-11T07:57:23.863 回答
4

没有看到完整的代码很难知道,但我有理由确定你的TextInfo类没有正确实现equals()hashCode(). 实现这两种方法是作为HashMap.

于 2012-09-11T07:57:49.700 回答
0

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

于 2012-09-11T08:00:46.593 回答