Я знаю, что это обсуждалось здесь снова и снова, но ни один из примеров, которые я пробовал, не работал для меня.
То, что у меня есть
Я получаю доступ к журналу звонков с 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);
Класс Contact Object прост:
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();
}
// Геттеры и сеттеры и конструктор ....
Просто используйте его как
Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);