0

次のようなデータモデルがあります。

    public class Person {
        String name = "";
        Integer id;
        public Person() {
            name = "";
            id = new Integer(0);
        }
    }

まず、2 つのオブジェクトを作成し、ベクターに追加しました。ベクトルを json 文字列に変換しました。再度チェックを行った後、json文字列をベクターに変換しました。ベクトル内には、正しい数の要素とデータが表示されています。しかし、あるオブジェクトの位置を取得しようとすると、-1 が返されます。vector.remove() を使用しても、オブジェクトを削除できません。ベクトルをjson文字列に変換しないと、うまくいきます。以下は私のコードです:

        Gson gson = new Gson();
        Vector vecResult = new Vector();

        Person person = new Person();
        person.name = "ABC";
        person.id = new Integer(1001);

        vecResult.add(person);

        Person person2 = new Person();
        person2.name = "DEF";
        person2.id = new Integer(1002);

        vecResult.add(person2);

        String json = gson.toJson(vecResult); //successful

        Type token = new TypeToken<Vector<Person>>() {}.getType();
        Vector<Person> vecResults = gson.fromJson(json3, token); //vecResults got 2 objects
        int pos = vecResults.indexOf(person); //returning -1
        boolean isRemoved = vecResults.remove(person); // returning false
4

3 に答える 3

1

以下をオーバーライドする必要があります

boolean equals(Object obj) 
int     hashCode()

Vector#removeインデックスを取得するために以下を使用しているため、コードが機能していません。

public synchronized int indexOf(Object o, int index) {
    if (o == null) {
        for (int i = index ; i < elementCount ; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = index ; i < elementCount ; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }

equals のデフォルトの実装は次のとおりです。

public boolean equals(Object obj) {
    return (this == obj);
    }
于 2013-04-09T14:12:12.533 に答える
1

あなたのPersonクラスはオーバーライドしませんequals()(またはhashCode())。

JSONにシリアル化してから逆シリアル化すると、新しいインスタンスが作成されますPerson-これは、関係する限り、元のインスタンスと完全に等しくindexOfありませんremove。それらはたまたま同じ値nameid値を持っていますが、自動的に等しくなるわけではありません。

オーバーライドObject.equals()Object.hashCode()て、あなたが望む平等の意味(名前だけ?IDだけ?両方?)とそれは問題ないはずです。

一般に、フィールドを非公開にし、プロパティのゲッター/セッターを提供する方がよいことに注意してください。

于 2013-04-09T14:12:19.330 に答える
0

remove() は equals() メソッドを介してオブジェクトを見つけようとします。デフォルトでは、これはオブジェクト ID です。person に対して明示的な equals() メソッドを生成します (Eclipse では、すべてのフィールドを使用して生成できます)。(equals() をオーバーライドする場合は、対応する hashcode() メソッドも必要です)

于 2013-04-09T14:13:09.020 に答える