如何从列表中删除重复

时间:2018-01-07 06:53:22

标签: java android

我在联系人应用程序中工作,我必须列出联系人数据库中的所有联系人,但它包含重复项。

例如,联系电话(98 ******* 33,+ 9198 ******** 33)被列为重复项。

我使用了Set,在添加之前检查我的列表是否包含电话号码,但这些都不起作用!

ContactVO是Pojo类,contactVoList是我添加联系人的列表。

   Cursor phones = getContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            while (phones.moveToNext()) {
                name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replace(" ", "");
                imageUri = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
                System.out.println("Name and Phone number = " + name + phoneNumber + imageUri);

                if (contactVOList.size() == 0) {
                    contactVOList.add(new ContactVO(imageUri, name, phoneNumber, false));
                } else {
                    if (!contactVOList.contains(phoneNumber)) {
                        contactVOList.add(new ContactVO(imageUri, name, phoneNumber, false));
                    }
                }

                System.out.println("List size before removing duplicates =" + contactVOList.size());
            }

            Set<ContactVO> s = new HashSet<ContactVO>();
            s.addAll(contactVOList);
            contactVOList = new ArrayList<ContactVO>();
            contactVOList.addAll(s);

我的Pojo课程

public class ContactVO {
    private String ContactImage;
    private String ContactName;
    private String ContactNumber;
    private int hashCode;
    String id;
    boolean clicked;

    public ContactVO(String id) {
        this.id = id;
    }

    public boolean isClicked() {
        return clicked;
    }

    public void setClicked(boolean clicked) {
        this.clicked = clicked;
    }

    public String getId() {


        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public ContactVO(String ContactImage, String ContactName, String ContactNumber, Boolean clicked) {
        this.ContactImage = ContactImage;
        this.ContactName = ContactName;
        this.ContactNumber = ContactNumber;
        this.clicked = clicked;
    }


    public String getContactImage() {
        return ContactImage;
    }

    public void setContactImage(String contactImage) {
        this.ContactImage = ContactImage;
    }

    public String getContactName() {
        return ContactName;
    }

    public void setContactName(String contactName) {
        ContactName = contactName;
    }

    public String getContactNumber() {
        return ContactNumber;
    }

    public void setContactNumber(String contactNumber) {
        ContactNumber = contactNumber;
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stubs
        if (obj instanceof ContactVO) {
            ContactVO temp = (ContactVO) obj;
            System.out.println("this.getctno" + this.getContactNumber());
            System.out.println("temp.getctno" + temp.getContactNumber());
            if (this.getContactNumber() == temp.getContactNumber() && this.getContactName() == temp.getContactName() && (this.getContactNumber()).contains(temp.getContactNumber()))
                return false;
        }
        return true;
    }

    @Override

    public int hashCode() {
        // TODO Auto-generated method stub
        return (this.getContactNumber().hashCode() + this.getContactName().hashCode());
    }
}

4 个答案:

答案 0 :(得分:0)

修改equals,如下所示。

 @Override
public boolean equals(Object obj) {
    if (obj instanceof ContactVO) {
        ContactVO temp = (ContactVO) obj;
        System.out.println("this.getctno" + this.getContactNumber());
        System.out.println("temp.getctno" + temp.getContactNumber());
        if (this.getContactNumber().equals(temp.getContactNumber()) &&
                this.getContactName().equals( temp.getContactName()))
            return true;
    }
    return false;
}
@Override
public int hashCode() {
    // TODO Auto-generated method stub
    return (this.getContactNumber().hashCode() + this.getContactName().hashCode());
}

有一件事要记住&#34; 98 ******* 33,+ 9198 ******** 33&#34;不是等于。 如果要测试它们是否相等并返回true,则必须修改equals()。 它不是最终的解决方案。但你可以尝试一下。

 @Override
public boolean equals(Object obj) {
    if (obj instanceof ContactVO) {
        ContactVO temp = (ContactVO) obj;
        if(getContactNumber().length()>=temp.getContactNumber().length()){
            if (this.getContactNumber().endsWith(temp.getContactNumber()) &&
                    this.getContactName().equals( temp.getContactName()))
                return true;
        }else{
            if (temp.getContactNumber().endsWith(this.getContactNumber()) &&
                    this.getContactName().equals( temp.getContactName()))
                return true;
        }
    }
    return false;
}

答案 1 :(得分:0)

在ContactVO类中覆盖等于 hashCode 方法可能有效。

当你使用HashSet时,它会调用类的hashCode方法来获取实例的哈希码,然后HashSet会将哈希码传递给索引,索引就是对象的位置。当你添加一个新对象时,它会获得一个索引并检查该位置是否有对象,如果没有,它将添加该对象,否则它将遍历链接列表并调用 equals 方法找到相同的对象,如果没有,该对象将被附加到链接列表。

代码示例:

@Override
public boolean equals(Object obj) { 
    ContactVO tmpContact= (ContactVO) obj; 
    if (phoneNumber.equals(tmpContact.phoneNumber)) return true; 
    else return false; 
} 

public int hashCode(){
     return phoneNumber.hashCode();
}

答案 2 :(得分:0)

试试这个......

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stubs
        if (obj instanceof ContactVO) {
            ContactVO temp = (ContactVO) obj;
            System.out.println("this.getctno" + this.getContactNumber());
            System.out.println("temp.getctno" + temp.getContactNumber());
            if (this.getContactNumber().equals(temp.getContactNumber()) || this.getContactNumber().endsWith(temp.getContactNumber()) ||
            temp.getContactNumber().endsWith(this.getContactNumber()))
                return true;
        }
        return false;
    }

答案 3 :(得分:0)

建议的解决方案的问题是,他们认为你的&#34;重复&#34;实际上是相等的字符串,它们不是。

你有&#34; 98 ******* 33&#34;和&#34; +9198 ******** 33&#34;作为重复,但它们不是相等的字符串。

因此,在将所有这些内容添加到您的设置之前,您需要做的是将电话号码规范化为通用的标准格式。你必须自己决定它应该是什么样子。我会建议像你的第二个例子:+没有任何空格或破折号。如果某个号码缺少国家/地区前缀,则必须假设某些默认值,或者您可以从联系人提供的其他信息中获取该默认值。

在此规范化之后,您的第一个号码也将是&#34; +9198 ******* 33&#34;和#Set-Solution&#39;将按预期工作。