ListUtils减法未按预期工作

时间:2020-05-10 11:03:38

标签: java collections

我有几个对象列表INFO listA List<test> listB 。我需要减去listA和listB并获取listA和listB中不匹配的对象的列表。如果两个列表都具有相同的对象,则我不应获取任何值。我尝试使用ListUtils.Subtract,但不幸的是,我没有获得正确的结果。请在下面找到我的示例代码:

List<test>

2 个答案:

答案 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)

问题的根本原因不是覆盖equalshashCode()。您也可以使用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