我尝试使用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
答案 0 :(得分:3)
确保您的Device
班级正确实施equals
和hashCode
方法。
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?