我知道这已经在这里一遍又一遍地讨论,但我尝试过的所有例子都没有为我工作。
我得到了什么
我从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似乎是最好的,因为它保持顺序就像我从Call日志中收到它一样。我试图让我的代码与它一起工作,但没有成功。任何人都可以根据我的例子给我一个示例代码。谢谢你的时间。
工作解决方案。谢谢大家的支持,你已经度过了我的一天。
在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);
答案 0 :(得分:8)
LinkedHashSet 可以在您的情况下使用。
HashSet:没有订单。
TreeSet:排序集,但不保持插入顺序。
编辑:正如Software Monkey评论的那样,hashCode()
和equals()
应该在ContactObject
中覆盖,以适应基于散列的集合。
答案 1 :(得分:4)
删除自定义对象的重复
使用比较器删除副本的示例
假设您有一个课程&#34;联系&#34;
public class Contact implements Comparable<Contact> {
public String getName() {
return this.Name;
}
public void setName(String name) {
this.Name = name;
}
public String getNumber() {
return this.Number;
}
public void setNumber(String number) {
this.Number = number;
}
///// this method is very important you must have to implement it.
@Override
public String toString() {
return "\n" +"Name=" + name + " Number=" + Number;
}
以下是使用设置删除重复条目的方法,只需在函数中传递列表即可。将返回新列表,其中没有重复的联系人。
public ArrayList<Contact> removeDuplicates(ArrayList<Contact> list){
Set set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(((Contact)o1).getNumber().equalsIgnoreCase(((Contact)o2).getNumber())){
return 0;
}
return 1;
}
});
set.addAll(list);
final ArrayList newList = new ArrayList(set);
return newList;
}
它对我有用,请尝试给我你的反馈。感谢
P.S:积分转到PollingStrategy
答案 2 :(得分:2)
List<ContactObject> listContacts = new ArrayList<ContactObject>();
//populate...
//LinkedHashSet preserves the order of the original list
Set<ContactObject> unique = new LinkedHasgSet<ContactObject>(listContacts);
listContacts = new ArrayList<ContactOjbect>(unique);
答案 3 :(得分:2)
当然,您可以使用TreeSet只存储一次,但常见的错误是不要覆盖hashCode()和equal()方法:
这适合你:
public boolean equals(Object obj) {
if (!(obj instanceof ContactObject))
return false;
return this.id == ((ContactObject) obj).getId(); // you need to refine this
}
public int hashCode() {
return name.hashCode();
}
答案 4 :(得分:1)
改为使用Set。
Set的作为一个数学集合,所以它不允许重复的元素。
因此,每次向其中添加新元素时,它都会检查每个元素的相等性和.equals()方法。