1

文字列のリストを入力として受け取るクラスを作成したいと思います。送信された文字列のリストが順序に関係なく等しい場合にこのクラスが常にtrueを返すように、このクラスのハッシュコードとequalsをオーバーライドしたいと思います。

コードは次のとおりです。

public final class TableValues
{
    private final String[] tableValue;

    TableValues(final String[] values)
    {
        this.tableValue = values;
    }

    /**
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.hashCode(tableValue);
        return result;
    }

    /**
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(final Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final TableValues other = (TableValues) obj;
        if (!Arrays.equals(tableValue, other.tableValue))
            return false;
        return true;
    }
}

しかし、私がするとき:

final String[] str1 = {"A", "B", "C"};
final String[] str2 = {"B", "C", "A"};
final TableValues tab1 = new TableValues(str1);
final TableValues tab2 = new TableValues(str2);
if (tab1.equals(tab2))
{
    System.out.println("Equal");
}
else
{
    System.out.println("Not Equal");
}

常に等しくないを出力します。ここで何が問題になっていますか?

4

2 に答える 2

2

TableValues配列が等しくないため、2つのインスタンスは等しくありません。これは、配列内の要素の順序が重要であるという事実によるものです。順序に依存しないマッチングが必要な場合は、コードに追加して、内容は同じで順序が異なる2つの配列を同じと見なすSet、順序が重要でない場合は文字列を使用する必要があります。

于 2012-05-22T21:42:18.507 に答える
1

変更してみてください:

if (!Arrays.equals(tableValue, other.tableValue))
        return false;

に :

if (!Arrays.equals(Arrays.sort(tableValue), Arrays.sort(other.tableValue)))
        return false;

Arrays.equalsのドキュメントから:

同じ要素が同じ順序で含まれている場合、2つの配列は等しくなります。

順序に関係なく等しい必要があるため、最初に並べ替えて、Arrays.equal等しいと見なす必要があります。

于 2012-05-22T21:47:30.297 に答える