我有数组列表对象,但我想过滤删除数据,如果在一天内有任何重复的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;
}
}
这是我的代码输出
我的目标期望结果
如何达到我的期望?和任何方法优雅地解决这个问题?
答案 0 :(得分:1)
我看到两个选项:
基本上你必须了解你的&#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