我有几个对象列表INFO
listA 和List<test>
listB 。我需要减去listA和listB并获取listA和listB中不匹配的对象的列表。如果两个列表都具有相同的对象,则我不应获取任何值。我尝试使用ListUtils.Subtract,但不幸的是,我没有获得正确的结果。请在下面找到我的示例代码:
List<test>
答案 0 :(得分:0)
因为您尚未覆盖.equals()
类的test
方法。 ListUtils.subtract()
使用equals()
方法确定要删除的项目。
在.equals()
类中覆盖test
,以便将两个具有相同字段值的test
实例视为相等。
.equals()
实现相同字段值的示例
@Override
public boolean equals(Object o) {
if (this == o)return true;// self check
if (o == null) return false; // null check
if (getClass() != o.getClass()) return false; // type check and cast
Test test = (Test) o;
// field comparison
return Objects.equals(firstName, test.firstName)
&& Objects.equals(lastName, test.lastName);
}
答案 1 :(得分:0)
问题的根本原因不是覆盖equals
和hashCode()
。您也可以使用List::removeAll
来做到这一点,如下所示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
class Test {
private String firstName;
private String lastName;
public Test(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName);
}
@Override
public boolean equals(Object obj) {
Test other = (Test) obj;
return this.firstName.equals(other.firstName) && this.lastName.equals(other.lastName);
}
@Override
public String toString() {
return "Test [firstName=" + firstName + ", lastName=" + lastName + "]";
}
}
public class Main {
public static void main(String[] args) {
List<Test> listA = new ArrayList<>(Collections.singletonList(new Test("sam", "rik")));
List<Test> listB = new ArrayList<>();
listB.add(new Test("sam", "rik"));
listB.add(new Test("nick", "wilson"));
List<Test> listBCopy = new ArrayList<>(listB);
listBCopy.removeAll(listA);
List<Test> result = new ArrayList<>(listBCopy);
System.out.println(result);
}
}
输出:
[Test [firstName=nick, lastName=wilson]]
在旁注中,您应始终遵循Java naming conventions,例如您的班级名称应为Test
,而不是test
。