2016-09-08 2 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

Я думаю, что ошибка приходят из этого LOC:

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(), хэш-код() методов к классу UniqueCompletedChat, что просто составляет два чатов, которые имеют одинаковые дата и врач ... одинаковые чат.

В принципе, вы должны понимать свою «модель», которая ведет ваш дизайн. И если в вашей модели такие две «чаты» «одинаковы», когда они происходят в тот же день, с тем же врачом, то ваша реализация должна отражать это.

И, говоря о good дизайн: не используйте низкоуровневые абстракции. Дата, является ... a date, а не Строка. Вероятно, у Java есть для многих способов управления датами, календарями, временем. Но хорошо: они есть. Выберите один из них. Вместо того, чтобы двигаться вокруг Струны. То же самое для «DoctorID»: создайте класс , который представляет эту вещь.

Вещь: толчок около Строки могут выглядеть удобными и простыми в использовании; но это напротив хорошего дизайна OO. Вы знаете, если вам не нужна система типа Javas; вы могли бы отступить и сделать все на динамическом языке вместо Java.

+0

Java имеет только два пути решения обработка даты и времени: (a) неприятный, запутанный и испорченный старый способ (java.util.Date, java.util.Calendar, java.text.SimpleDateFormat и т. д.) и (b) современный чистый мощный способ в классах 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) 

Просто добавив один метод вашего класса 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 
+0

если вы используете java 7 как его реализовать? – unknown

Смежные вопросы