排序的联系人列表有重复项,为什么?
Sorted list of contacts having duplicates ,why?
我已经将我的 phone 联系人排序并列出到一个数组列表中,但是,我在列表中有很多重复的相同联系人姓名。这是怎么发生的?如何避免这种情况?
这是我试过的,
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null,
"(" + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + ") ASC");
while (cursor.moveToNext()) {
try {
name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
phonenumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact_names_list.add(name);
phone_num_list.add(phonenumber);
} catch (Exception e) {
e.printStackTrace();
}
有人能帮忙吗??
您可以使用 HashSet
来避免重复:-
HashSet<String> hset =
new HashSet<String>();
你可以在HashSet
中添加ArrayList
:-
hset.add(your_string);
或
将您的 ArrayList
转换为 HashSet
:-
Set<String> set = new HashSet<String>(your_arraylist_object);
HashSet
避免重复输入:)
你可以试试HashSet
。
public class HashSet extends AbstractSet implements Set,
Cloneable, Serializable
不允许重复值。
代码结构
HashSet<String> hashSET = new HashSet<String>();
hashSET.add("AA");
hashSET.add("BB");
hashSET.add("CC");
hashSET.add("AA"); // Adding duplicate elements
然后
Iterator<String> j = hashSET.iterator();
while (j.hasNext())
System.out.println(j.next()); // Will print "AA" once.
}
现在 SORT
您的 Hashset
值使用 TreeSet
.
TreeSet implements the SortedSet interface so duplicate values are not
allowed.
TreeSet<String> _treeSET= new TreeSet<String>(hashSET);
可能在您的联系人中有多个群组,该群组将是 WhatsApp,Google 等。转到您的联系人并搜索那个拥有 whatsApp 的联系人帐户。将显示具有不同 Group
的复式条目
您应该使用或更改您的 ContactsBean
,在您的 Bean
中使用 HashSet
Note: HashSet
can avoid duplicate entry more
HashSet
contains unique elements only,it can avoid same key element form HashSet
示例 bean
public class ContactBean {
private HashSet<String> number = new HashSet<String>();
public void setNumber(String number) {
if (number == null)
return;
this.number.add(number.trim());
}
public HashSet<String> getNumber() {
return this.number;
}
}
简单示例
//Creating HashSet and adding elements
HashSet<String> hashSet=new HashSet<String>();
hashSet.add("Dhruv");
hashSet.add("Akash");
hashSet.add("Dhruv"); //Avoiding this entry
hashSet.add("Nirmal");
//Traversing elements
Iterator<String> itr = hashSet.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
我不知道你为什么从联系人那里得到重复的项目,也许 phone 联系人已经有重复项 values.You 可以在“联系人”应用程序中检查。
您应该始终在任何想要避免重复项的地方使用集合数据结构。你可以找到更好的解释和例子 here.
我认为您的重复是因为 Whatsapp 联系人干扰了联系人。所以你可以使用这样的东西
String lastPhoneName = "";
String lastPhoneNumber = "";
//IN YOUR CONTACT FETCHING WHILE LOOP , INSIDE TRY
String contactName = c.getString(c
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phNumber = c
.getString(c
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (!contactName.equalsIgnoreCase(lastPhoneName) && !phNumber.equalsIgnoreCase(lastPhoneNumber)) {
lastPhoneName = contactName;
lastPhoneNumber = phNumber;
ContactModel model = new ContactModel();
model.setContact_id(contactid);
model.setContact_name(contactName.replaceAll("\s+", ""));
model.setContact_number(phNumber.replaceAll("\D+", ""));
list_contact_model.add(model);
}
这将检查之前的号码是否与旧号码相同而不是跳过它。我希望你得到你的答案
HashSet
添加 key/value 对中的项目并从项目集中删除重复项。
List<String> phone_num_list= new ArrayList<>();
// add elements to phone_num_list, including duplicates
Set<String> hs = new HashSet<>();
hs.addAll(phone_num_list);
phone_num_list.clear();
phone_num_list.addAll(hs);
编码愉快!!
这里似乎没有人回答你的问题。
您看到重复联系人的原因是您查询的是 phones 而不是 contacts。
在Android中有3个主要的table:
Contacts
table - 每个联系人有一个项目
RawContacts
table - 每个联系人每个帐户有一个项目(例如 Google、Outlook、Whatsapp 等) - 多个 RawContacts
已链接到单个 Contact
Data
table - 每个细节有一个项目(姓名、电子邮件、phone、地址等) - 每个数据项目都链接到一个 RawContact
,并且多个 Data
行链接到每个 RawContact
.
您正在查询 CommonDataKinds.Phone.CONTENT_URI
,它是 Data
table 的一部分,因此如果联系人有多个 phone,and/or 它具有来自多个来源(例如 Google 和 Whatsapp)的相同 phone,您将获得相同的 phone 和相同的 CONTACT_ID
一次。
解决方案是,使用 HashMap
(而不是 HashSet
),其中键为 CONTACT_ID
,因此您可以显示多个 phone每个联系人:
String[] projection = new String[] { CommonDataKinds.Phone.CONTACT_ID, CommonDataKinds.Phone.DISPLAY_NAME, CommonDataKinds.Phone.NUMBER };
Cursor cursor = getContentResolver().query(CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
HashMap<Long, Contact> contacts = new HashMap<>();
while (cursor.moveToNext()) {
long id = cursor.getLong(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
Contact c = contacts.get(id);
if (c == null) {
// newly found contact, add to Map
c = new Contact();
c.name = name;
contacts.put(id, c);
}
// add phone to contact class
c.phones.add(phone);
}
cursor.close();
// simple class to store multiple phones per contact
private class Contact {
public String name;
// use can use a HashSet here to avoid duplicate phones per contact
public List<String> phones = new ArrayList<>();
}
如果您想按名称对 HashMap 进行排序:
List<Contact> values = new ArrayList<>(contacts.values());
Collections.sort(values, new Comparator<Contact> {
public int compare(Contact a, Contact b) {
return a.name.compareTo(b.name);
}
});
// iterate the sorted list, per contact:
for (Contact contact : values) {
Log.i(TAG, "contact " + contact.name + ": ");
// iterate the list of phones within each contact:
for (String phone : contact.phones) {
Log.i(TAG, "\t phone: " + phone);
}
}
我已经将我的 phone 联系人排序并列出到一个数组列表中,但是,我在列表中有很多重复的相同联系人姓名。这是怎么发生的?如何避免这种情况?
这是我试过的,
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null,
"(" + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + ") ASC");
while (cursor.moveToNext()) {
try {
name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
phonenumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact_names_list.add(name);
phone_num_list.add(phonenumber);
} catch (Exception e) {
e.printStackTrace();
}
有人能帮忙吗??
您可以使用 HashSet
来避免重复:-
HashSet<String> hset =
new HashSet<String>();
你可以在HashSet
中添加ArrayList
:-
hset.add(your_string);
或
将您的 ArrayList
转换为 HashSet
:-
Set<String> set = new HashSet<String>(your_arraylist_object);
HashSet
避免重复输入:)
你可以试试HashSet
。
public class HashSet extends AbstractSet implements Set, Cloneable, Serializable
不允许重复值。
代码结构
HashSet<String> hashSET = new HashSet<String>();
hashSET.add("AA");
hashSET.add("BB");
hashSET.add("CC");
hashSET.add("AA"); // Adding duplicate elements
然后
Iterator<String> j = hashSET.iterator();
while (j.hasNext())
System.out.println(j.next()); // Will print "AA" once.
}
现在 SORT
您的 Hashset
值使用 TreeSet
.
TreeSet implements the SortedSet interface so duplicate values are not allowed.
TreeSet<String> _treeSET= new TreeSet<String>(hashSET);
可能在您的联系人中有多个群组,该群组将是 WhatsApp,Google 等。转到您的联系人并搜索那个拥有 whatsApp 的联系人帐户。将显示具有不同 Group
的复式条目您应该使用或更改您的 ContactsBean
,在您的 Bean
中使用 HashSet
Note:
HashSet
can avoid duplicate entry more
HashSet
contains unique elements only,it can avoid same key element formHashSet
示例 bean
public class ContactBean {
private HashSet<String> number = new HashSet<String>();
public void setNumber(String number) {
if (number == null)
return;
this.number.add(number.trim());
}
public HashSet<String> getNumber() {
return this.number;
}
}
简单示例
//Creating HashSet and adding elements
HashSet<String> hashSet=new HashSet<String>();
hashSet.add("Dhruv");
hashSet.add("Akash");
hashSet.add("Dhruv"); //Avoiding this entry
hashSet.add("Nirmal");
//Traversing elements
Iterator<String> itr = hashSet.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
我不知道你为什么从联系人那里得到重复的项目,也许 phone 联系人已经有重复项 values.You 可以在“联系人”应用程序中检查。
您应该始终在任何想要避免重复项的地方使用集合数据结构。你可以找到更好的解释和例子 here.
我认为您的重复是因为 Whatsapp 联系人干扰了联系人。所以你可以使用这样的东西
String lastPhoneName = "";
String lastPhoneNumber = "";
//IN YOUR CONTACT FETCHING WHILE LOOP , INSIDE TRY
String contactName = c.getString(c
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phNumber = c
.getString(c
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (!contactName.equalsIgnoreCase(lastPhoneName) && !phNumber.equalsIgnoreCase(lastPhoneNumber)) {
lastPhoneName = contactName;
lastPhoneNumber = phNumber;
ContactModel model = new ContactModel();
model.setContact_id(contactid);
model.setContact_name(contactName.replaceAll("\s+", ""));
model.setContact_number(phNumber.replaceAll("\D+", ""));
list_contact_model.add(model);
}
这将检查之前的号码是否与旧号码相同而不是跳过它。我希望你得到你的答案
HashSet
添加 key/value 对中的项目并从项目集中删除重复项。
List<String> phone_num_list= new ArrayList<>();
// add elements to phone_num_list, including duplicates
Set<String> hs = new HashSet<>();
hs.addAll(phone_num_list);
phone_num_list.clear();
phone_num_list.addAll(hs);
编码愉快!!
这里似乎没有人回答你的问题。
您看到重复联系人的原因是您查询的是 phones 而不是 contacts。
在Android中有3个主要的table:
Contacts
table - 每个联系人有一个项目RawContacts
table - 每个联系人每个帐户有一个项目(例如 Google、Outlook、Whatsapp 等) - 多个RawContacts
已链接到单个Contact
Data
table - 每个细节有一个项目(姓名、电子邮件、phone、地址等) - 每个数据项目都链接到一个RawContact
,并且多个Data
行链接到每个RawContact
.
您正在查询 CommonDataKinds.Phone.CONTENT_URI
,它是 Data
table 的一部分,因此如果联系人有多个 phone,and/or 它具有来自多个来源(例如 Google 和 Whatsapp)的相同 phone,您将获得相同的 phone 和相同的 CONTACT_ID
一次。
解决方案是,使用 HashMap
(而不是 HashSet
),其中键为 CONTACT_ID
,因此您可以显示多个 phone每个联系人:
String[] projection = new String[] { CommonDataKinds.Phone.CONTACT_ID, CommonDataKinds.Phone.DISPLAY_NAME, CommonDataKinds.Phone.NUMBER };
Cursor cursor = getContentResolver().query(CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
HashMap<Long, Contact> contacts = new HashMap<>();
while (cursor.moveToNext()) {
long id = cursor.getLong(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
Contact c = contacts.get(id);
if (c == null) {
// newly found contact, add to Map
c = new Contact();
c.name = name;
contacts.put(id, c);
}
// add phone to contact class
c.phones.add(phone);
}
cursor.close();
// simple class to store multiple phones per contact
private class Contact {
public String name;
// use can use a HashSet here to avoid duplicate phones per contact
public List<String> phones = new ArrayList<>();
}
如果您想按名称对 HashMap 进行排序:
List<Contact> values = new ArrayList<>(contacts.values());
Collections.sort(values, new Comparator<Contact> {
public int compare(Contact a, Contact b) {
return a.name.compareTo(b.name);
}
});
// iterate the sorted list, per contact:
for (Contact contact : values) {
Log.i(TAG, "contact " + contact.name + ": ");
// iterate the list of phones within each contact:
for (String phone : contact.phones) {
Log.i(TAG, "\t phone: " + phone);
}
}