2016-09-08 94 views
0

我有數組列表對象,但我想篩選刪除數據,如果有一天重複的ID。刪除與條件java重複列表對象

這是我的代碼從我的代碼

enter image description here

我的目標預期結果

enter image description here

如何達到我的期望

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; 
    } 
} 

這是輸出?和任何優雅的方法來解決這個問題?

回答

1

我認爲來自這個LOC的bug:

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

嘗試結合起來,並檢查它是這樣的:

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

當然,你可以使用StringBuilder獲得更好的性能。

1

我看到兩個選項:

  1. 做手工(循環陣列,並且搞清楚重複)
  2. 如果使用設置,並添加的equals(),hashCode()方法,以類UniqueCompletedChat,簡單地使得兩個相同的日期和醫生... 相同的聊天。

基本上你必須瞭解指導你設計的「模型」。而且,如果在你的模型中,這兩個「聊天」在同一天發生的時間與同一位醫生「相同」,那麼你的實施應該反映這一點。

而且,談論設計:不要使用低級抽象。日期,是... 日期,而不是字符串。可能Java有到很多不同的方式來處理日期,日曆,時間。但是,他們在那裏。選擇其中一個。而不是移動字符串。 「DoctorID」相同:創建一個代表該事物的

事情是:推動字符串可能看起來方便和容易做到;但它是相反的一個很好的面向對象設計。你知道,如果你不關心使用Java類型系統,你可以退後一步,用動態語言而不是Java來做所有事情。

+0

的Java只有兩種方式來處理日期時間處理:(a)麻煩的,混亂的和有缺陷的舊方法(java.util.Date,java.util.Calendar,java.text.SimpleDateFormat等)和(b)mod在java.time類中使用乾淨強大的方法。避免任何不在java.time包中的日期 - 時間類。 –

0

如果你是java的8

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

剛上你的聊天類中添加一個方法:

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 
+0

如果使用java 7怎麼實現呢? – unknown