Ali*_*lin 9 java android arraylist hashcode treeset
我知道这已经在这里一遍又一遍地讨论,但我尝试过的所有例子都没有为我工作.
我得到了什么
我从Android访问呼叫日志,我得到了所有呼叫的列表.当然,在这里我得到了很多重复.首先我制作一份清单
List<ContactObject> lstContacts = new ArrayList<ContactObject>();
Run Code Online (Sandbox Code Playgroud)
然后我在其中添加对象
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);
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
我需要的
我需要在列表中只有一次联系人.正如我在这里读到的,有几件事可以做,比如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();
}
Run Code Online (Sandbox Code Playgroud)
// Getters and Setters和COnstructor ....
只需将其用作
Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);
Run Code Online (Sandbox Code Playgroud)
保持插入顺序的 LinkedHashSet可以在您的情况下使用.
HashSet:没有订单.
TreeSet:排序集,但不保持插入顺序.
编辑:由于软件猴评论,hashCode()并equals()应被重写ContactObject,以适应基于散列的集合.
删除重复的自定义对象
使用比较器删除重复项的示例
假设您有一个“联系人”类
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;
}
Run Code Online (Sandbox Code Playgroud)
这是您可以使用Set删除重复项的方法,只需在函数中传递您的列表即可使用。将返回没有重复联系人的新列表。
public ArrayList<Contact> removeDuplicates(ArrayList<Contact> list){
Set<Contact> set = new TreeSet(new Comparator<Contact>() {
@Override
public int compare(Contact o1, Contact o2) {
if(o1.getNumber().equalsIgnoreCase(o2.getNumber())){
return 0;
}
return 1;
}
});
set.addAll(list);
final ArrayList newList = new ArrayList(set);
return newList;
}
Run Code Online (Sandbox Code Playgroud)
它对我有用,所以请尝试给我您的反馈。谢谢
| 归档时间: |
|
| 查看次数: |
10709 次 |
| 最近记录: |