2016-09-08 7 views
0

私は配列リストオブジェクトを持っていますが、ある日に重複したIDがあればデータを削除したいです。条件javaで重複リストオブジェクトを削除する

これは私のコード

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

から出力されましたか?これを解決するためのエレガントな方法はありますか?

答えて

1

もちろん

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

を、あなたは、パフォーマンスを向上させるためのStringBuilderを使用することができます。

1

私は2つのオプションを参照してください。

  1. は、単にセットを使用して
  2. (あなたの配列をループして、重複を把握)手でそれをやって、そのUniqueCompletedChatあなたのクラスに等号()、ハッシュコード()メソッドを追加することをと同じと医者の2つののチャットを作成します。同じチャットです。

基本的には、デザインをガイドする "モデル"を理解する必要があります。あなたのモデルでこのような2つの「チャット」が同じ医師と同じ日に起こったときに「同じ」の場合、その実装はそれを反映する必要があります。

いいえデザイン:低レベルの抽象化を使用しないでください。日付は、の日付で、の文字列ではありません。おそらくJavaはからまで、日付、カレンダー、時間を扱うさまざまな方法を持っています。しかし、うーん、彼らはそこにいる。それらの1つを選んでください。 文字列の代わりに移動します。 "DoctorID"と同じです:クラスを作成してください。

事実は:文字列は便利で簡単に見えるかもしれません。良いOOデザインのとは逆のです。あなたが知っている、もしJavas型システムの使用に気をつけなければ、 Javaの代わりに動的言語ですべてをやりなおすことができます。

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

が結合し、このようにそれをチェックしてください:私はバグは、このLOCから来ると思います

+0

Javaがに対処する唯一の二つの方法があります日時処理:(a)面倒で、混乱し、欠陥のある古い方法(java.util.Date、java.util.Calendar、java.text.SimpleDateFormatなど)、(b)mod java.nemanクラスでは、きれいで強力な方法です。 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

関連する問題