我知道这已经在这里讨论了一遍又一遍,但我尝试过的例子都没有为我工作。
我有什么
我从 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();
}
//Getter 和 Setter 以及构造函数....
只需将其用作
Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);