0

removeAll(Collection<?> a)コレクション内のオブジェクトが削除されていないのに、なぜtrue を返すのですか? カスタム オブジェクトの hashcode と equals メソッドをオーバーライドします。入力からのオブジェクトのハッシュコードは、選択範囲内のオブジェクトのハッシュコードと同じです。

 private void onRemove(IStructuredSelection selection) {
            boolean removeAll = getInput().removeAll(selection.toList()); // returns true
            Set<ReadingNodeCfg> input = getInput(); // Object from selection is still there
    }

入力からのオブジェクトは選択内のオブジェクトと同じですが、なぜ彼はそれを削除しないのでしょうか?

よろしくお願いします

edit1 : eclipse で equals と hashcode を生成しました。getInput() は a を返しHashSet<ReadingNodeCfg>、selection.toList() は a を返します。List<ReadingNodeCfg>

edit2 :

   for (Object object : selection.toList()) {
        boolean remove = getInput().remove(object); // returns false
        int hashCode = object.hashCode(); // returns 1130504316
        int hashCode2 = getInput().iterator().next().hashCode(); // returns 1130504316
        boolean equals = object.equals(getInput().iterator().next()); // returns true

    }

edit3 : 現在、IObservableList を使用しています。それは今うまくいきます!

変更後の入力でハッシュコードが変更されました。そして、削除したいオブジェクトには、変更された入力オブジェクトと同じハッシュコードがありましたが、とにかく機能せず、その理由はまだわかりません。

解決:

さて、私は今問題を解決しました。同じ問題を抱えている他の人のために例を作成しました。

@Test
    public void derp() {
        Person person = new Person();
        person.name = "jay";

        Set<Person> humans = new HashSet<>();
        humans.add(person);

        person.name = "fred";
        assertTrue(!humans.remove(person));
    }

personこのオブジェクトは、変更後に削除することはできません。personハッシュセットは、オブジェクト自体のハッシュコードを見つけることができません。

  1. のハッシュコードperson: 1337
  2. ハッシュコードに追加すると、このハッシュコードとオブジェクトの間の参照のようなものが作成されます
  3. 人の名前を変更すると、ハッシュコードが変更されます: 1338
  4. ハッシュコードからこのオブジェクトを削除すると、ハッシュコード 1337 のオブジェクトを削除しようとしますが、うまくいきません
  5. quals/hashcode をオーバーライドしない場合、問題なくこのアイテムを削除できます

よろしくお願いします

4

2 に答える 2

1

解決:

さて、私は今問題を解決しました。同じ問題を抱えている他の人のために例を作成しました。

@Test
    public void derp() {
        Person person = new Person();
        person.name = "jay";

        Set<Person> humans = new HashSet<>();
        humans.add(person);

        person.name = "fred";
        assertTrue(!humans.remove(person));
    }

変更後にこの人物オブジェクトを削除することはできません。ハッシュセット自体は、オブジェクトの人物のハッシュコードを見つけることができません。

  1. 個人のハッシュコード: 1337
  2. ハッシュコードに追加すると、このハッシュコードとオブジェクトの間の参照のようなものが作成されます
  3. 人の名前を変更すると、ハッシュコードが変更されます: 1338
  4. ハッシュコードからこのオブジェクトを削除すると、ハッシュコード 1337 のオブジェクトを削除しようとしますが、うまくいきません
  5. equals/hashcode をオーバーライドしない場合、問題なくこのアイテムを削除できます。

よろしくお願いします

于 2013-09-18T18:40:13.487 に答える
1

コレクション内のオブジェクトが削除されていないのに、removeAll(Collection a) が true を返すのはなぜですか?

コレクションが変更された場合にのみ true を返します。コレクションが変更されていないように見える場合は、間違ったコレクションを探しています。getter の結果を変更する (これは悪い習慣です) 代わりに、タスクを呼び出し元に渡すことをお勧めします。例えば

boolean removeAll = removeAllFromInput(selection.toList()); // returns true

私の賭けはgetInput()、コレクションの防御的なコピーを取得して、誤って変更しようとするのを避けることです。

于 2013-09-16T08:29:00.870 に答える