使用条件java删除重复的列表对象

使用条件java删除重复的列表对象,java,list,object,Java,List,Object,我有数组列表对象,但如果一天内有重复的id,我想过滤并删除数据 这是我的密码 public static void main(String[] args) { ArrayList<UniqueCompletedChat> al = new ArrayList<UniqueCompletedChat>(); al.add(new UniqueCompletedChat("2015-11-01", "D01")); al.ad

我有数组列表对象,但如果一天内有重复的id,我想过滤并删除数据

这是我的密码

public static void main(String[] args) {

        ArrayList<UniqueCompletedChat> al = new ArrayList<UniqueCompletedChat>();
        al.add(new UniqueCompletedChat("2015-11-01", "D01"));
        al.add(new UniqueCompletedChat("2015-11-01", "D01"));
        al.add(new UniqueCompletedChat("2015-11-01", "D02"));
        al.add(new UniqueCompletedChat("2015-11-01", "D01"));
        al.add(new UniqueCompletedChat("2015-11-02", "D01"));
        al.add(new UniqueCompletedChat("2015-11-02", "D02"));
        al.add(new UniqueCompletedChat("2015-11-02", "D03"));
        al.add(new UniqueCompletedChat("2015-11-02", "D02"));
        al.add(new UniqueCompletedChat("2015-11-02", "D02"));
        al.add(new UniqueCompletedChat("2015-11-03", "D01"));

        List<UniqueCompletedChat> result = new ArrayList<UniqueCompletedChat>();
        Set<String> titles = new HashSet<String>();

        for (UniqueCompletedChat u : al) {
            if (titles.add(u.getIdDoctor()) || titles.add(u.getDate())) {
                result.add(u);
            }
        }

        for(UniqueCompletedChat u : result){
            System.out.print(u.getDate() + " || ");
            System.out.print(u.getIdDoctor());
            System.out.println("");
        }
}

class UniqueCompletedChat {
    private String date;
    private String idDoctor;

    public UniqueCompletedChat(String date, String idDoctor) {
        this.date = date;
        this.idDoctor = idDoctor;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getIdDoctor() {
        return idDoctor;
    }

    public void setIdDoctor(String idDoctor) {
        this.idDoctor = idDoctor;
    }
}
publicstaticvoidmain(字符串[]args){
ArrayList al=新的ArrayList();
新增(新的UniqueCompletedChat(“2015-11-01”、“D01”);
新增(新的UniqueCompletedChat(“2015-11-01”、“D01”);
新增(新的UniqueCompletedChat(“2015-11-01”、“D02”);
新增(新的UniqueCompletedChat(“2015-11-01”、“D01”);
新增(新的UniqueCompletedChat(“2015-11-02”,“D01”);
新增(新的UniqueCompletedChat(“2015-11-02”,“D02”);
新增(新的UniqueCompletedChat(“2015-11-02”,“D03”);
新增(新的UniqueCompletedChat(“2015-11-02”,“D02”);
新增(新的UniqueCompletedChat(“2015-11-02”,“D02”);
新增(新的UniqueCompletedChat(“2015-11-03”,“D01”);
列表结果=新建ArrayList();
Set titles=new HashSet();
用于(唯一完整聊天u:al){
if(titles.add(u.getIdDoctor())| | titles.add(u.getDate())){
结果:添加(u);
}
}
对于(UniqueCompletedChat u:结果){
System.out.print(u.getDate()+“| |”);
System.out.print(u.getIdDoctor());
System.out.println(“”);
}
}
类UniqueCompletedChat{
私有字符串日期;
私人医生;
公共UniqueCompletedChat(字符串日期,字符串ID医生){
this.date=日期;
this.idDoctor=idDoctor;
}
公共字符串getDate(){
返回日期;
}
公共无效设置日期(字符串日期){
this.date=日期;
}
公共字符串getIdDoctor(){
返回idDoctor;
}
公共void setIdDoctor(字符串idDoctor){
this.idDoctor=idDoctor;
}
}
这是我的代码的输出

我的目标期望结果

如何达到我的期望?有什么方法可以优雅地解决这个问题吗?

我看到两种选择:

  • 手工操作(循环数组并计算重复项)
  • 使用一个集合,并将equals()和hashcode()方法添加到类UniqueCompletedChat中,只需创建两个日期和医生相同的聊天。。。同样的聊天
  • 基本上,您必须理解指导您的设计的“模型”。而且,如果在您的模型中,这两次“聊天”发生在同一天、同一位医生身上时是“相同的”,那么您的实现应该反映出这一点

    而且,谈论好的设计:不要使用低级抽象。约会,是。。。日期,而不是字符串。Java可能有很多不同的方法来处理日期、日历和时间。但是好吧:他们在那里。选一个。而不是移动字符串。与“DoctorID”相同:创建一个表示该对象的类

    事情是这样的:在字符串上推来推去可能看起来既方便又容易;但这与良好的OO设计正好相反。你知道,如果你不在乎使用Javas类型的系统;您也可以退一步,用动态语言而不是Java来做任何事情。

    我看到两种选择:

  • 手工操作(循环数组并计算重复项)
  • 使用一个集合,并将equals()和hashcode()方法添加到类UniqueCompletedChat中,只需创建两个日期和医生相同的聊天。。。同样的聊天
  • 基本上,您必须理解指导您的设计的“模型”。而且,如果在您的模型中,这两次“聊天”发生在同一天、同一位医生身上时是“相同的”,那么您的实现应该反映出这一点

    而且,谈论好的设计:不要使用低级抽象。约会,是。。。日期,而不是字符串。Java可能有很多不同的方法来处理日期、日历和时间。但是好吧:他们在那里。选一个。而不是移动字符串。与“DoctorID”相同:创建一个表示该对象的类


    事情是这样的:在字符串上推来推去可能看起来既方便又容易;但这与良好的OO设计正好相反。你知道,如果你不在乎使用Javas类型的系统;您也可以退一步,用动态语言而不是Java来做任何事情。

    我认为错误来自以下位置:

    if (titles.add(u.getIdDoctor()) || titles.add(u.getDate())) {
        result.add(u);
    }
    
    尝试按如下方式组合并检查:

    if (titles.add(u.getIdDoctor() + u.getDate())) {
        result.add(u);
    }
    

    当然,您可以使用StringBuilder以获得更好的性能。

    我认为错误来自以下位置:

    if (titles.add(u.getIdDoctor()) || titles.add(u.getDate())) {
        result.add(u);
    }
    
    尝试按如下方式组合并检查:

    if (titles.add(u.getIdDoctor() + u.getDate())) {
        result.add(u);
    }
    
    当然,您可以使用StringBuilder获得更好的性能。

    如果您使用的是java 8

    Collection<UniqueCompletedChat> result = al.stream()
                    .<Map<String, UniqueCompletedChat>>collect(HashMap::new, (k, uc) -> k.put(uc.getKey(), uc), Map::putAll)
    
    印刷品:

    2015-11-02 || D02
    2015-11-01 || D02
    2015-11-02 || D03
    2015-11-03 || D01
    2015-11-02 || D01
    2015-11-01 || D01
    
    如果您使用的是Java8

    Collection<UniqueCompletedChat> result = al.stream()
                    .<Map<String, UniqueCompletedChat>>collect(HashMap::new, (k, uc) -> k.put(uc.getKey(), uc), Map::putAll)
    
    印刷品:

    2015-11-02 || D02
    2015-11-01 || D02
    2015-11-02 || D03
    2015-11-03 || D01
    2015-11-02 || D01
    2015-11-01 || D01
    

    如果使用java 7如何实现它?如果使用java 7如何实现它?java只有两种处理日期-时间处理的方法:(a)麻烦、混乱和有缺陷的旧方法(java.util.date、java.util.Calendar、java.text.SimpleDataFormat等)和(b)java.time类中的现代干净、强大的方法。避免任何不在java.time包中的日期时间类。java只有两种方法来处理日期时间处理:(a)麻烦、混乱且有缺陷的旧方法(java.util.date、java.util.Calendar、java.text.simpleDataFormat等)和(b)java.time类中现代的干净、强大的方法。避免任何不在java.time包中的日期时间类。