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 总是错误的,但我可以在调试模式下看到 devicesScannerList 已经包含给定的设备,我不想再次添加它。

我是否误解了 contains 功能?帮助会很棒

谢谢英戈

4

1 回答 1

3

确保你的Device类实现equalshashCode方法正确。

例如,如果您创建 2 个Device具有完全相同数据的对象,除非设备已实现,否则它们将不会被ObservableArrayList(或任何列表)视为相同。equals/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 回答