ObservableList#contains()为现有项返回false

时间:2013-07-16 13:30:29

标签: javafx-2

我尝试使用OberservableLists包含函数来检查给定元素是否已经在List中,如果没有添加它。 我的代码看起来像:

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

稍后我做

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

问题是deviceExists总是假的,但我可以在调试模式下看到devicesScannerList已经包含给定的设备,我不想再添加它。

我是否会理解包含功能? 帮助会很棒

THX INGO

1 个答案:

答案 0 :(得分:3)

确保您的Device班级正确实施equalshashCode方法。

E.g。如果您使用完全相同的数据创建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
    }
}

但是如果你在Device:

旁边添加,这段代码可以正常工作(两次打印都是真的)
        @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
        }

在此处查看更多详情:What issues should be considered when overriding equals and hashCode in Java?