2

OberservableLists contains 関数を使用して、指定された要素が既にリストにあるかどうかを確認し、そうでない場合は追加しようとしました。私のコードは次のようになります。

ObservableList<Device> devicesScannerList = FXCollections.observableArrayList()
deviceScannerList.add((Device)dev);

後で私はそうします

Device dev = (Device)devices.get(0);
boolean deviceExists =  devicesScannerList.contains(dev);
if (deviceExists){....}

問題は、deviceExists が常に false であるということですが、デバッグ モードで devicesScannerList に特定のデバイスが既に含まれていることがわかり、再度追加したくありません。

contains 関数を誤解していませんか? ヘルプは素晴らしいでしょう

Thxインゴ

4

1 に答える 1

3

Deviceクラスの実装equalshashCodeメソッドが正しく行われていることを確認してください。

たとえば、まったく同じデータを持つ 2 つのオブジェクトを作成した場合、デバイスが実装されていない限り、(または任意のリスト)Deviceによって同じとは見なされません。ObservableArrayListequals/hashCode

次の例を参照してください。

public class ObsListTest {

    static class Device {
        int value;

        public Device(int value) {
            this.value = value;
        }
    }

    public static void main(String[] args) {
        ObservableList<Device> list = FXCollections.<Device>observableArrayList();
        Device data1 = new Device(1);
        Device anotherData1 = new Device(1);
        list.add(data1);
        System.out.println(list.contains(data1)); // true
        System.out.println(list.contains(anotherData1)); // false
    }
}

ただし、次のデバイスを追加すると、このコードは機能します (両方とも true を出力します)。

        @Override
        public boolean equals(Object obj) {
            if (obj == null || getClass() != obj.getClass()) {
                return false;
            }
            return this.value == ((Device) obj).value;
        }

        @Override
        public int hashCode() {
            return 7 + 5*value; // 5 and 7 are random prime numbers
        }

詳細については、こちらを参照してください: Java で equals と hashCode をオーバーライドする場合に考慮すべき問題は何ですか?

于 2013-07-16T13:52:44.337 に答える