Удаление повторяющихся объектов из ArrayList в Android

Я знаю, что здесь это обсуждается снова и снова,но ни один из примеров, которые я пробовал, у меня не сработал.

Что у меня есть

Я открываю журнал вызовов с Android и получаю список всех сделанных вызовов. Конечно, здесь много дубликатов. Сначала я составляю список

List<ContactObject> lstContacts = new ArrayList<ContactObject>();

Затем я добавляю в него объекты

While (get some record in call log)
{
    ContactObject contact = new ContactObject();
    contact.SetAllProperties(......)  
    lstContacts.add(contact);  
}

Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);

Класс объекта контакта прост

public class ContactObject {

    public ContactObject() {
        super();
    }

 @Override
 public boolean equals(Object obj) {
     if (!(obj instanceof ContactObject))
        return false;

     return this.lstPhones == ((ContactObject) obj).getLstPhones(); 
 }

 @Override
 public int hashCode() {
     return lstPhones.hashCode();
 }

    private long Id;
    private String name;
    private List<String> lstPhones;  
    private String details;

   //... getters and settres
}

Что мне нужно

Мне нужен контакт только один раз в списке. Как я читал здесь, есть несколько вещей, которые можно сделать, например Set, HashSet, TreeSet. TreeSet кажется лучшим, так как он сохраняет порядок так же, как я получаю его из журнала вызовов. Я пытался заставить свой код работать с ним, но безуспешно. Может ли кто-нибудь быть так любезен, чтобы дать мне образец кода на основе моего примера. Спасибо за ваше время.

Рабочее решение. Спасибо всем за вашу поддержку, вы сделали мне день.

В ContactObject переопределите два метода

 @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof ContactObject))
            return false;

         return lstPhones.equals(((ContactObject) obj).getLstPhones());
     }

     @Override
     public int hashCode() {
         return (lstPhones == null) ? 0 : lstPhones.hashCode();
     }

// Getters and Setters и COnstructor ....

Просто используйте его как

Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);
9
задан Alin 18 July 2011 в 06:37
поделиться