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

时间:2016-09-08 03:19:20

标签: 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.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;
    }
}

这是我的代码输出

enter image description here

我的目标期望结果

enter image description here

如何达到我的期望?和任何方法优雅地解决这个问题?

3 个答案:

答案 0 :(得分:1)

我看到两个选项:

  1. 手工完成(循环播放数组并重复计算)
  2. 使用Set,并将equals(),hashcode()方法添加到您的类UniqueCompletedChat,它只会使两个聊天具有相同的日期和医生...... 相同的聊天。
  3. 基本上你必须了解你的&#34;模型&#34;指导您的设计。并且,如果在你的模型中这样的两个&#34;聊天&#34;是&#34;相同&#34;当他们在同一天发生时,由同一位医生,那么你的实施应该反映出来。

    并且,谈论良好设计:不要使用低级抽象。日期是...... 日期,而不是字符串。可能Java有很多到很多不同的方式来处理日期,日历和时间。但是好吧:他们在那里。选择其中之一。而不是移动字符串。同样适用于&#34; DoctorID&#34;:创建代表该事物的

    事情是:推动字符串可能看起来既方便又容易;但它是一个好的OO设计的相反。你知道,如果你不关心使用Javas类型系统;你也可以退一步用动态语言而不是Java来做所有事情。

答案 1 :(得分:1)

我认为这个错误来自这个LOC:

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

尝试组合并检查它:

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

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

答案 2 :(得分:0)

如果您使用的是java 8

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

只需在Chat类上添加一个方法:

public String getKey() {
    return this.idDoctor + this.date;
}

打印:

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