4

私は a を使用してSparseIntArrayいますが、この動作に困惑しています:

public static SparseIntArray getArray()
{
    SparseIntArray result = new SparseIntArray();
    result.append(0, 99);
    result.append(1, 988);
    result.append(2, 636);

    return result;
}

public static void testArray()
{
    SparseIntArray first = getArray();
    SparseIntArray second = getArray();
    if( first.equals(second) )
    {
        Log.v(TAG,"first "+first.toString()+" == second "+second.toString());           
    }
    else
    {
        Log.v(TAG,"first "+first.toString()+" != second "+second.toString());
    }
}

出力:

11-06 14:53:15.011: V/fileName(6709): first {0=99, 1=988, 2=636} != second {0=99, 1=988, 2=636}

2 つのオブジェクト間で == を使用するとオブジェクト アドレスが比較されることはわかっていますが、この場合は異なりますが、ここでは使用してSparseIntArray.equals(Object other)おり、意図した結果は予期しないものではありません。

独自の比較メソッドをロールバックできると確信していますが、それはばかげているように聞こえます。Object.equals(Object other)依存できない場合、基本クラスのメソッドを使用する意味は何ですか?

誰かが間違いを指摘できますか?

4

2 に答える 2

1

@Eranは正しいです、 Object. equals(Object) はそれをカットしません。

2 つのインスタンスを比較する単純な静的メソッドを作成しました

public static boolean compareSame( SparseIntArray first, SparseIntArray second )
{
    // compare null
    if( first == null )
    {
        return (second == null);
    }
    if( second == null )
    {
        return false;
    }

    // compare count
    int count = first.size();
    if( second.size() != count )
    {
        return false;
    }

    // for each pair
    for( int index = 0; index < count; ++index )
    {
        // compare key
        int key = first.keyAt(index);
        if( key != second.keyAt(index))
        {
            return false;
        }

        // compare value
        int value = first.valueAt(index);
        if( second.valueAt(index) != value)
        {
            return false;
        }
    }       

    return true;
}

おそらく、独自のバージョンの SparseIntArray を派生させて equals メソッドをオーバーライドすることになるでしょう。これはよりクリーンだと思います。

[編集] equals を実装するサブクラスのコードは次のとおりです。

import android.util.SparseIntArray;

public class SparseIntArrayComparable extends SparseIntArray {
@Override
public boolean equals( Object obj ) {

    if( obj instanceof SparseIntArray ) {
        SparseIntArray other = (SparseIntArray)obj;

        // compare count
        int count = size();
        if( count != other.size() )
            return false;

        // for each pair
        for( int index = 0; index < count; ++index ) {

            if( keyAt(index) != other.keyAt(index))
                return false;

            if( valueAt(index) != other.valueAt(index) )
                return false;
        }       

        return true;
    }
    else
        return false;
    }
}
于 2014-11-06T20:24:33.243 に答える