我在联系人应用程序中工作,我必须列出联系人数据库中的所有联系人,但它包含重复项。
例如,联系电话(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());
}
}
答案 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;将按预期工作。