Я знаю, что здесь это обсуждается снова и снова,но ни один из примеров, которые я пробовал, у меня не сработал.
Что у меня есть
Я открываю журнал вызовов с 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);