我想比较两个列表的内容,特别是存储在这两个列表中的自定义对象的某种方法,我们称之为#getID()
。
我的方法是让方法告诉我这两个列表是否包含具有相同ID的相同条目。
List<CustomObject> firstList;
List<CustomObject> secondList;
循环遍历firstList
中的每个条目,在其上调用getID()并查看secondList
中是否有一个对象返回getID()的相同值。
进行此项检查的有效方法是什么?最好使用Java 8流,它们在这里非常有用。
答案 0 :(得分:1)
如果两个列表都已排序,您可以这样做:
public boolean equalsLists(List<YourClass> a, List<YourClass> b) {
if (a.size() != b.size()) {
return false;
}
for (int i = 0; i < a.size(); i++) {
if (!a.get(i).getId().equals(b.get(i).getId()) {
return false;
}
}
return true;
}
如果您可以对元素进行排序,请对它们进行排序并应用之前显示的相同算法。
否则算法的效率取决于很多因素:
答案 1 :(得分:1)
假设两个列表都已排序,您可以使用comparator
。
Comparator<List<CustomObject>> myComp = new Comparator<List<CustomObject>>() {
@Override
public int compare(List<CustomObject> customObjectList, List<CustomObject> t1) {
for (int i = 0; i < customObjectList.size(); i++) {
if (customObjectList.getId().equals(t1.getId())) {
// Do your logic here
}
}
}
};
myComp.compare(list1, list2);
这是&#34; Java&#34;做事的方式。如果列表的大小不匹配,您将不得不练习某种防御性编程。如果未对它们进行排序,则可以在比较这两个列表之前使用Collections.sort
。
答案 2 :(得分:0)
获取重复元素的一种方法是使用Map,如下所示。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
public class SomeClass {
protected class Component {
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Component(String id, String description) {
super();
this.id = id;
this.description = description;
}
String id;
String description;
@Override
public String toString() {
// TODO Auto-generated method stub
return "Id " + this.getId();
}
}
public static void main(String[] args) {
Component component1 = new SomeClass().new Component("1", "One");
Component component2 = new SomeClass().new Component("2", "One");
Component component3 = new SomeClass().new Component("1", "One");
Component component4 = new SomeClass().new Component("3", "Three");
Component component5 = new SomeClass().new Component("4", "Four");
List<Component> list1 = new ArrayList<Component>();
list1.add(component1);
list1.add(component2);
List<Component> list2 = new ArrayList<Component>();
list1.add(component1);
list1.add(component2);
list2.add(component3);
list2.add(component4);
list2.add(component5);
Map<String, Component> result = list2.stream().collect(Collectors.toMap(Component::getId, Function.identity()));
Set<Component> repeated = list1.stream().filter(component -> result.containsKey(component.getId()))
.collect(Collectors.toSet());
repeated.forEach(System.out::println);
}
}