我有两个需要比较的对象列表。对象具有名称属性,并且我想检查具有该名称的一个对象是否存在于另一个列表中。
我遇到了ListUtils.subtract方法,但我只看到人们使用Int或String等类型...
可以与自定义对象类型一起使用吗?
编辑:
Myclass{
private String name;
public getName(){
return this.name;
}
}
我有两个这种对象类型的列表:
List<MyClass> list1;
List<MyClass> list2;
其中一个列表是使用一些SQL查询创建的。创建另一个检查服务器中的某些文件。这些列表中的对象数可以相同,或者一个或另一个可以有更多对象。
有没有办法获取一个列表中的对象,而不是另一个列表中的对象?
这样的事情:
List result = ListUtils.subract (list1,list2);
但使用名称属性。
答案 0 :(得分:0)
您可以将ListUtils.subtract与两个列表一起使用。要使其工作,您必须定义自定义类的equals
方法,以便当且仅当两个对象的name属性相同时才返回true。
那就是说, ListUtils.substract
没有给你两个列表之间的交集。为此,您将使用ListUtils.retainAll
。你也可以简单地使用List.retainAll
但它会修改你的一个列表而不是创建一个副本,所以你应该自己创建这样一个副本。
编辑:所以你不想要交集,你真的想要减法。这样很好,只需写下对象的等于:
bool equals(Object other) {
if (other==null || !other instanceof MyClass) {
return false;
}
return name.equals(other.name); // assume name is never null. You can check for that
}
您也可以在列表中使用Collection.removeAll
。
覆盖equals
并不总是切实可行,例如,如果您根据其他属性有不同的场景要进行比较。在这种情况下,您可以使用Guava library中的Comparator
和Collections2.filter
。
答案 1 :(得分:0)
使对象实现Comparable
。在compareTo()
方法中,根据name属性进行比较。
答案 2 :(得分:0)
你也可以使用比较器和可比较的。以下是http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html
的示例答案 3 :(得分:-3)
答案是没有rtf 为什么你不使用谷歌自己找到它 为什么不使用ide来向您显示文档
我的thinlk覆盖等于解决问题但是是黑客
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String arg[]) {
ArrayList<Dog> firstGroup = new ArrayList<Dog>();
firstGroup.add(new Dog("Rintintin"));
firstGroup.add(new Dog("Courage"));
firstGroup.add(new Dog("Scooby-Dooby-Do"));
ArrayList<Dog> secondGroup = new ArrayList<Dog>();
secondGroup.add(new Dog("fido"));
secondGroup.add(new Dog("Courage"));
secondGroup.add(new Dog("Rintintin"));
List<Dog> filterByName = filterByName(firstGroup,secondGroup);
System.out.print(Arrays.toString(filterByName.toArray()));
}
private static List<Dog> filterByName(ArrayList<Dog> firstGroup, ArrayList<Dog> secondGroup) {
List<Dog> result=new ArrayList<>();
for (Dog orginal : firstGroup)
for (Dog finDog : secondGroup)
if(orginal.getName().equals(finDog.getName()))
result.add(new Dog(orginal.getName()));
return result;
}
}