Java 如何显示两个对象列表之间的唯一元素?

Java 如何显示两个对象列表之间的唯一元素?,java,eclipse,eclipse-rcp,Java,Eclipse,Eclipse Rcp,我有两个充满对象元素的列表。使用这两个列表,我想创建另一个只包含它们之间不常见元素的列表 我尝试使用迭代器: for(Row currentRowObject: currentRow) { for (Iterator<Row> newError = newErrorRow.iterator(); newError.hasNext(); ) { Row rowObject = newError.next(); if (rowObject.getA

我有两个充满对象元素的列表。使用这两个列表,我想创建另一个只包含它们之间不常见元素的列表

我尝试使用迭代器:

for(Row currentRowObject: currentRow) {
    for (Iterator<Row> newError = newErrorRow.iterator(); newError.hasNext(); ) {
        Row rowObject = newError.next();
        if (rowObject.getAll().equals(currentRowObject.getAll())) {
            newError.remove();
        }
    }
}
for(行currentRowObject:currentRow){
for(迭代器newError=newErrorRow.Iterator();newError.hasNext();){
行rowObject=newError.next();
if(rowObject.getAll().equals(currentRowObject.getAll())){
newError.remove();
}
}
}
运行此操作后,
newError
列表将被完全删除。我检查了这两个列表是否不同,它们的大小不同,并且这两个列表之间存在不同的对象

如何解决此问题?

您可以使用集合属性&use

Setrows1=新哈希集(currentRow);
Setrows2=newhashset(newErrorRow);
第1行。保留(第2行);//行1现在只包含两个集合中的元素!
第2行。移除所有(第1行);//行2现在只包含唯一的元素!
您可以使用集合属性&use

Setrows1=新哈希集(currentRow);
Setrows2=newhashset(newErrorRow);
第1行。保留(第2行);//行1现在只包含两个集合中的元素!
第2行。移除所有(第1行);//行2现在只包含唯一的元素!

要以逻辑格式(非Java)对此进行解释:

下面是一种在Java中快速而肮脏的方法。希望这些评论能解释我所做的

Set<Row> uncommonRows=new HashSet<Row>(currentRow);
uncommonRows.addAll(newErrorRow); //at this point uncommonRows contains all the Rows
Set<Row> retained=new HashSet<Row>(currentRow);
retained.retainAll(newErrorRow); //retained contains all rows that are in both sets.
uncommonRows.removeAll(retained) ; // at this point uncommonRows contains the uncommon Rows
Set uncommonRows=新哈希集(currentRow);
uncommonRows.addAll(newErrorRow)//此时,uncommonRows包含所有行
保留集=新哈希集(currentRow);
保留。保留(新错误行)//保留包含两个集中的所有行。
不常见。删除所有(保留);//此时,uncommonRows包含不常见的行

要以逻辑格式(非Java)对此进行解释:

下面是一种在Java中快速而肮脏的方法。希望这些评论能解释我所做的

Set<Row> uncommonRows=new HashSet<Row>(currentRow);
uncommonRows.addAll(newErrorRow); //at this point uncommonRows contains all the Rows
Set<Row> retained=new HashSet<Row>(currentRow);
retained.retainAll(newErrorRow); //retained contains all rows that are in both sets.
uncommonRows.removeAll(retained) ; // at this point uncommonRows contains the uncommon Rows
Set uncommonRows=新哈希集(currentRow);
uncommonRows.addAll(newErrorRow)//此时,uncommonRows包含所有行
保留集=新哈希集(currentRow);
保留。保留(新错误行)//保留包含两个集中的所有行。
不常见。删除所有(保留);//此时,uncommonRows包含不常见的行

使用java8,您可以执行以下操作:

    final List<Row> allErrors = new ArrayList<>();
    allErrors.addAll(currentRow);
    allErrors.addAll(newErrorRow);
final List allErrors=new ArrayList();
allErrors.addAll(当前行);
allErrors.addAll(newErrorRow);
然后:

final List<Row> result = allErrors.stream().filter(p -> Collections.frequency(allErrors, p) == 1)
            .collect(Collectors.toList());
final List result=allErrors.stream().filter(p->Collections.frequency(allErrors,p)==1)
.collect(Collectors.toList());

使用java8,您可以执行以下操作:

    final List<Row> allErrors = new ArrayList<>();
    allErrors.addAll(currentRow);
    allErrors.addAll(newErrorRow);
final List allErrors=new ArrayList();
allErrors.addAll(当前行);
allErrors.addAll(newErrorRow);
然后:

final List<Row> result = allErrors.stream().filter(p -> Collections.frequency(allErrors, p) == 1)
            .collect(Collectors.toList());
final List result=allErrors.stream().filter(p->Collections.frequency(allErrors,p)==1)
.collect(Collectors.toList());

+1/您可以将
row1
初始化为
Set row1=new HashSet(currentRow)newErrorRow
row2
执行相同的操作。同时也修正了retailAll to Retainal中的拼写错误。我刚刚看到OP要求使用不常见的元素!我认为这仍然是错误的,因为您缺少currentRow的独特元素。我认为nafas的解决方案是迟早会出现的,但我的第一个想法与你的想法完全相同。+1/你可以将
row1
初始化为
Set row1=new HashSet(currentRow)newErrorRow
row2
执行相同的操作。同时也修正了retailAll to Retainal中的拼写错误。我刚刚看到OP要求使用不常见的元素!我认为这仍然是错误的,因为您缺少currentRow的独特元素。我认为nafas的解决方案是你迟早会想到的,但我的第一个想法和你的想法完全一样。@JohnSmith你能上传你是如何定义你的类行的吗。你必须重写equal(对象o)和hashCode()方法(使它们唯一)。这个链接应该可以帮助你@JohnSmith顺便说一句,确保你打印出不寻常的行:)@vefthym是的,我认为没有equals方法是原始方法一开始不起作用的原因我解决了这个问题,原因是我错误地颠倒了列表,这就是为什么它不起作用,我很困惑为什么它不起作用,因为我有equals和hashcode方法:)@JohnSmith你能上传你是如何定义你的类行的吗。你必须重写equal(对象o)和hashCode()方法(使它们唯一)。这个链接应该可以帮助你@JohnSmith顺便说一句,确保你打印出不寻常的行:)@vefthym是的,我认为没有equals方法是原始方法一开始不起作用的原因我解决了这个问题,原因是我错误地颠倒了列表,这就是为什么它不起作用,我很困惑为什么它不起作用,因为我有equals和hashcode方法:)