Java 在Android中删除ArrayList中的重复对象
我知道这已经在这里被反复讨论过了,但是我尝试过的所有例子都不适用于我 我所拥有的Java 在Android中删除ArrayList中的重复对象,java,android,arraylist,hashcode,treeset,Java,Android,Arraylist,Hashcode,Treeset,我知道这已经在这里被反复讨论过了,但是我尝试过的所有例子都不适用于我 我所拥有的 public class Contact implements Comparable<Contact> { public String getName() { return this.Name; } public void setName(String name) { this.Name = name; } public String getNumber() { retu
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;
}
我从安卓系统访问通话记录,得到所有通话的列表。当然,我这里有很多复制品。
首先,我列出一个清单
List<ContactObject> lstContacts = new ArrayList<ContactObject>();
//getter和setter以及构造函数
只需将其用作
Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);
Set unique=newlinkedhashset(lstContacts);
lstContacts=新阵列列表(唯一);
保持插入顺序的
可用于您的案例
HashSet:没有顺序
树集:已排序的集,但不保留插入顺序
编辑:正如软件Monkey评论的那样,hashCode()
和equals()
应该在ContactObject
中被覆盖,以适应基于哈希的集合。列表contacts=new ArrayList();
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);
//填充。。。
//LinkedHashSet保留原始列表的顺序
Set unique=新的LinkedHasgSet(listContacts);
listContacts=新的ArrayList(唯一);
当然,您只能使用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();
}
用Set代替
集合作为一个数学集合工作,因此它不允许重复的元素
因此,每次添加新元素时,它都会检查每个元素的相等性和.equals()方法。删除自定义对象的重复
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;
}
使用比较器删除重复项的示例
假设您有一个类“联系人”
公共类联系人实现可比较{
公共字符串getName(){
返回此.Name;
}
公共void集合名(字符串名){
this.Name=Name;
}
公共字符串getNumber(){
返回此.Number;
}
公共无效集合号(字符串号){
这个。数字=数字;
}
/////这个方法非常重要,你必须实现它。
@凌驾
公共字符串toString(){
返回“\n”+“Name=“+Name+”Number=“+Number;
}
下面是如何使用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;
}
public ArrayList removeDuplicates(ArrayList列表){
Set Set=新树集(新比较器(){
@凌驾
公共int比较(联系人o1,联系人o2){
if(o1.getNumber().equalsIgnoreCase(o2.getNumber())){
返回0;
}
返回1;
}
});
set.addAll(列表);
最终ArrayList newList=新ArrayList(集合);
返回newList;
}
它对我有效,所以请尝试给我你的反馈。谢谢
附言:我的建议值得称赞。如果需要区分大小写,hash和equals可以使用monocased(
toUpperCase
)key.editted:我知道你在谈论一个基于散列的集合,vsm在谈论一个树集。我的评论在这里是假的。@Platvoet:LinkedHashSet's-a'HashSet,LinkedHashSet添加了双链接列表,运行在它的所有条目中。虽然树集不是从HashSet扩展而来的。我已经更新了代码……结果是一样的,所有重复项都在那里。我参与了按联系人的LstPhone比较ContactObject,因为如果联系人的LstPhone号码相同,则联系人是相同的。@Alin:在方法equals():“==”中,只需比较引用,您可以尝试lstPhones.equals(((ContactObject)obj).getLstPhones())
。在方法hashCode():(lstPhones==null)?0:lstPhones.hashCode()
会更好。不正确,对于树集来说,元素应该是错误的:From JAVADOC将指定的元素添加到此集合,如果它还不存在。更正式地说,如果集合不包含元素e2,则将指定的元素e添加到此集合中(e==null?e2==null:e.equals(e2))。如果此集合已经包含元素,则调用将保持集合不变并返回false。那么我们都错了:),它们应该同时实现。如果没有和Comparator/Comparable,TreeSet也无法运行。如果没有Comparator,则可以创建一个TreeSet,而不使用Comparator。从JAVADOC中,可以创建一个基于TreeMap的NavigableSet实现。ele根据使用的构造函数,可以使用元素的自然顺序,也可以使用在设置创建时提供的比较器对元素进行排序。如果要使用比较器创建树集,则应使用树集=新树集(新比较器(){public int compare(String o1,String o2){返回0;//比较应在此处完成});是的,因此在这种情况下,您需要提供一个comparator/comparable,因为我们讨论的是ContactObject。此外,contains不使用equals和hashcode,请参阅使代码中的所有内容保持不变的实现,与前面一样,为我提供了samre listContactacs,带有重复项
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<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;
}