Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中删除ArrayList中的重复对象_Java_Android_Arraylist_Hashcode_Treeset - Fatal编程技术网

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