Java 过滤对象列表中的重复对象

Java 过滤对象列表中的重复对象,java,list,object,filter,duplicates,Java,List,Object,Filter,Duplicates,我的Java代码中的对象列表有问题。 此对象由以下字段填充: -名字 -姓氏 -生日 -车祸日期 现在,此列表可以计算具有相同值(姓名、姓氏、生日)的某些对象 例如: 卢克·天行者1970年10月9日2008年10月10日 卢克·天行者1970年10月9日2009年10月10日 我的目标是删除重复的用户,并为每个用户添加一个新的列表,其中只包含一个最近发生车祸的用户 在前面的示例中: 卢克·天行者1970年10月9日2009年10月10日 你们有什么想法吗?如果让您的用户类实现Compariab

我的Java代码中的对象列表有问题。 此对象由以下字段填充:

-名字 -姓氏 -生日 -车祸日期

现在,此列表可以计算具有相同值(姓名、姓氏、生日)的某些对象

例如:

卢克·天行者1970年10月9日2008年10月10日

卢克·天行者1970年10月9日2009年10月10日

我的目标是删除重复的用户,并为每个用户添加一个新的列表,其中只包含一个最近发生车祸的用户

在前面的示例中:

卢克·天行者1970年10月9日2009年10月10日


你们有什么想法吗?

如果让您的用户类实现
Compariable
,那么您可以使用
SortedSet

class User implements Comparable<User> {
    // fields, constructor, methods etc...

    @Override
    public void compareTo(User other) {
        // assuming carAccidentDate is comparable
        return carAccidentDate.compareTo(other.carAccidentDate);
    }

    @Override
    public boolean equals(Object other) {
        return /* true if name, lastname and birthdate are equal */
    }

    @Override
    public int hashCode() {
        return /* hash code of name, lastname and birthdate */
    }
}
Set<User> latestAccidentsUser = new TreeSet<>(users);

对于这个问题,我们有两个要求

删除重复项

保留最近的车祸记录

对于要求1: 我们已设置哈希以消除重复。为此,我们必须重写equals()和hashcode(),因为默认值基于对象内存位置,而这个问题基于值(name、Lastname、birthdate)

关于要求2: 首先,根据事故日期按降序对用户进行排序。我们将在复制品中的最前面发生一次车祸。由于用户已经存在,所以不会将重复的和添加到HashSet中

代码如下:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

class User {
    String name;
    String lastname;
    String birthdate;
    String carAccidentDate;

    public User(String name,
            String lastname,
            String birthdate,
            String carAccidentDate){
        this.name = name;
        this.lastname = lastname;
        this.birthdate = birthdate;
        this.carAccidentDate = carAccidentDate;
    }

    @Override
    public boolean equals(Object other) {
        if (this == other) {
            return true;
        }
        if (other == null || getClass() != other.getClass()) {
            return false;
        }
        User o = (User) other;
        return o.name.equals(name) && o.lastname.equals(lastname)
                && o.birthdate.equals(birthdate);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, lastname, birthdate);
    }

    @Override
    public String toString(){
        return String.join(",", name,lastname,birthdate,carAccidentDate);
    }

    public static void main(String input[]) {
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

        User[] users = new User[]{
                new User("Luke", "skywalker", "09/10/1970", "10/10/2008"),
                new User("Luke", "skywalker", "09/10/1970", "10/10/2009")
        };

        Arrays.sort(users, (B, A) -> {
            try {
                return dateFormat.parse(A.carAccidentDate).compareTo(dateFormat.parse(B.carAccidentDate));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return 0;
        });

        Set<User> userSet = new HashSet(Arrays.asList(users));

        for(User u: userSet){
            System.out.println(u.toString());
        }
    }
}
导入java.text.DateFormat;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.array;
导入java.util.HashSet;
导入java.util.Objects;
导入java.util.Set;
类用户{
字符串名;
字符串lastname;
字符串生日;
串卡拉奇齿;
公共用户(字符串名称,
字符串lastname,
字符串生日,
字符串(偶然日期){
this.name=名称;
this.lastname=lastname;
this.birthdate=生日;
this.caracidentDate=caracidentDate;
}
@凌驾
公共布尔等于(对象其他){
if(this==其他){
返回true;
}
if(other==null | | getClass()!=other.getClass()){
返回false;
}
用户o=(用户)其他;
返回o.name.equals(name)和&o.lastname.equals(lastname)
&&o.出生日期等于(出生日期);
}
@凌驾
公共int hashCode(){
返回Objects.hash(姓名、姓氏、生日);
}
@凌驾
公共字符串toString(){
返回字符串。join(“,”,name,lastname,birthdate,caracidentdate);
}
公共静态void main(字符串输入[]){
DateFormat DateFormat=新的简化格式(“dd/MM/yyyy”);
用户[]用户=新用户[]{
新用户(“卢克”、“天行者”、“1970年10月9日”、“2008年10月10日”),
新用户(“卢克”、“天行者”、“1970年10月9日”、“2009年10月10日”)
};
排序(用户,(B,A)->{
试一试{
return dateFormat.parse(A.carAccidentDate).compareTo(dateFormat.parse(B.carAccidentDate));
}捕获(解析异常){
e、 printStackTrace();
}
返回0;
});
Set userSet=newhashset(Arrays.asList(users));
for(用户u:userSet){
System.out.println(u.toString());
}
}
}

欢迎来到堆栈溢出。请与我们分享您的尝试,到目前为止您尝试了什么。同时,看看java 8流和过滤功能。这将有助于用更少的代码解决这个问题。