如何比较 Java 中两个列表之间的内部字段?
How do compare an internal field between two lists in Java?
我有 List<MainClass> list1
和 List<MainClass> list2
。
public class MainClass {
private List<Question> questions;
}
public class Question {
private Long questionId;
}
我需要比较列表 1 中的问题 ID 和列表 2 中的问题 ID。我应该从 List1 中获取那些在 List2 中不存在的问题 ID(如 List<Long> ids
)。
我已经编写了下一个代码,其中我分别从 list1 和 list2 中分别获取 ID。然后我必须比较 idsFromList1 和 idsFromList1 以找出缺少的 ID。我的问题:使用流或以某种简短、优雅的方式从 List1 中获取 List2 中不存在的那些 questionId(作为 List id)的方法是什么?
List<Long> idsFromList1= list1.stream().map(mc->mc.getQuestion)).flatMap(List::stream).map(q->q.getQuestionId()).collect(Collectors.toList());
List<Long> idsFromList2= list2.stream().map(mc->mc.getQuestion)).flatMap(List::stream).map(q->q.getQuestionId()).collect(Collectors.toList());
是的,可以添加对 list1
问题 ID 的 Stream
的 filter()
调用,其中谓词将检查 list2
的元素, 和 return true
如果其中 none 个具有当前 ID。
List<Long> diff = list1.stream()
.flatMap(mc->mc.getQuestions().stream()
.map(Question::getQuestionId))
.filter(id1 -> list2.stream()
.flatMap(mc->mc.getQuestions().stream()
.map(Question::getQuestionId))
.noneMatch(id2 -> id2.equals(id1)))
.collect(Collectors.toList());
但是,这需要二次方时间 运行。
如果你生成两个 Set
的问题 ID 并找出不同之处,你会更好:
Set<Long> idsFromList1 = list1.stream()
.flatMap(mc->mc.getQuestions().stream().map(Question::getQuestionId))
.collect(Collectors.toSet());
Set<Long> idsFromList2= list2.stream() .flatMap(mc->mc.getQuestions().stream().map(Question::getQuestionId))
.collect(Collectors.toSet());
Set<Long> diff = idsFromList1.removeAll(idsFromList2);
我有 List<MainClass> list1
和 List<MainClass> list2
。
public class MainClass {
private List<Question> questions;
}
public class Question {
private Long questionId;
}
我需要比较列表 1 中的问题 ID 和列表 2 中的问题 ID。我应该从 List1 中获取那些在 List2 中不存在的问题 ID(如 List<Long> ids
)。
我已经编写了下一个代码,其中我分别从 list1 和 list2 中分别获取 ID。然后我必须比较 idsFromList1 和 idsFromList1 以找出缺少的 ID。我的问题:使用流或以某种简短、优雅的方式从 List1 中获取 List2 中不存在的那些 questionId(作为 List id)的方法是什么?
List<Long> idsFromList1= list1.stream().map(mc->mc.getQuestion)).flatMap(List::stream).map(q->q.getQuestionId()).collect(Collectors.toList());
List<Long> idsFromList2= list2.stream().map(mc->mc.getQuestion)).flatMap(List::stream).map(q->q.getQuestionId()).collect(Collectors.toList());
是的,可以添加对 list1
问题 ID 的 Stream
的 filter()
调用,其中谓词将检查 list2
的元素, 和 return true
如果其中 none 个具有当前 ID。
List<Long> diff = list1.stream()
.flatMap(mc->mc.getQuestions().stream()
.map(Question::getQuestionId))
.filter(id1 -> list2.stream()
.flatMap(mc->mc.getQuestions().stream()
.map(Question::getQuestionId))
.noneMatch(id2 -> id2.equals(id1)))
.collect(Collectors.toList());
但是,这需要二次方时间 运行。
如果你生成两个 Set
的问题 ID 并找出不同之处,你会更好:
Set<Long> idsFromList1 = list1.stream()
.flatMap(mc->mc.getQuestions().stream().map(Question::getQuestionId))
.collect(Collectors.toSet());
Set<Long> idsFromList2= list2.stream() .flatMap(mc->mc.getQuestions().stream().map(Question::getQuestionId))
.collect(Collectors.toSet());
Set<Long> diff = idsFromList1.removeAll(idsFromList2);