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

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

おそらく、キーオブジェクトがequals()とhashCode()を正しくオーバーライドしていないためです。

JavaチュートリアルスーパークラスとしてObject.hashCode()のセクションオブジェクトのドキュメントを参照してください。

またはさらに良い:JoshuaBlochによるEffectiveJava(2nd Ed)を読む

于 2012-09-11T07:57:23.863 に答える
4

完全なコードを見ずに知るのは難しいですが、あなたのTextInfoクラスが正しく実装されていないequals()ことは確かですhashCode()。これらの2つのメソッドを実装することは、のキーとして役立つための前提条件ですHashMap

于 2012-09-11T07:57:49.700 に答える
0

作成したオブジェクトを Map のキーとして使用するには、hashCode()andequals()メソッドを上書きする必要があります。TextInfoあなたのクラスが同じ実装を提供していないと確信しています。

于 2012-09-11T08:00:46.593 に答える