Alin Alin - 1 month ago 11
Android Question

Remove duplicate objects from a ArrayList in Android

I know this has be discussed over and over again here, but none of the examples I've tried worked for me.

What I've got

I access the Call log from Android and I get a list of all calls made. Of course, here I get a lot of duplicates.
First I make a List

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


Then I add objects into it

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);


The Contact Object class is simple

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
}


What I need

I need to have a Contact only once in the list. As I've read around here there are a couple of things that can be done like Set, HashSet, TreeSet. TreeSet seems the best as it keeps the order just as I receive it from the Call log. I've tried to make my code work with it but no success. Could anyone be so kind to give me a sample code based on my example. Thank you for your time.

The Working Solution. Thank you all for your support, you've made my day.

In ContactObject override the two methods

@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 and COnstructor....

Simply use it as

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

Answer

LinkedHashSet which keeps insertion-order can be used in your case.

HashSet: no order.

TreeSet: sorted set, but not keep insertion order.

EDIT: As Software Monkey commented, hashCode() and equals() should be overwritten in ContactObject to fit the hash-based Set.