2014-05-20 31 views
0

我试图解决的问题是试图从一个列表中删除“匹配”另一个列表中的数据的数据,其中我将匹配定义为相等在我已经定义的两个属性中。Java - 根据两个对象的数据子集检查相等性

假设对象是一个盒子。它具有字符串大小,颜色和字符串所有者。

我说如果他们有相同的大小和相同的颜色,两个盒子是相等的。请注意,我无法重新定义Box对象,但我想如果需要的话我可以继承它。

如果我的等于的定义是相同的大小,那么我会在O(N)中做一个集合。

Set<String> boxSizes = newHashSet(); 
for (Box box : boxList1) { 
    boxSizes.add(box.getSize()); 
} 

for (Box box : boxList2) { 
    if (boxSizes.contains(box.getSize()) { 
    // This is a duplicate 
    } 
} 

我可以效仿用于检查通过编写一个小班级,以这种方式来实现equals根据大小和颜色平等此相同的解决方案。然而,这种解决方案似乎夸大了这样一个简单的比较。

我也可以从我关心的属性的某些组合中构造出密钥,例如,

boxKeys.add(box.getSize() + box.color.toString()); 

这可能会奏效,虽然肯定会有一些边缘情况。除了感觉错误之外,我对这个解决方案没有任何有力的论据。

那么,这个操作应该实现什么样的解决方案呢?

回答

0

A TreeSet通过使用compareTo()而不是equals()来打破Set合同,以确定对象相等性。您可以使用自定义Comparator来实现您想要的。只需要编写一个额外的类(并且使compareTo()对于不相等的对象也是合理的)。

相关问题