排序的联系人列表有重复,为什么?

我已经将我的手机联系人排序并列入了一个arraylist但是,我在列表中find了许多相同联系人姓名的副本。这种情况怎么样? 怎么避免这个?

这是我试过的,

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

谁能帮忙?

这里似乎没有人回答你的问题。

您看到重复联系人的原因是您要查询电话而不是联系人

在Android中有3个主要表:

  1. Contacts表 – 每个联系人有一个项目
  2. RawContacts表 – 每个帐户每个联系人有一个项目(例如Google,Outlook, RawContacts等) – 多个RawContacts链接到一个Contact
  3. Data表 – 每个细节有一个项目(名称,电子邮件,电话,地址等) – 每个数据RawContact接到一个RawContact ,多个Data行链接到每个RawContact

您正在查询CommonDataKinds.Phone.CONTENT_URI这是Data表的一部分,所以如果一个联系人有多个电话,和/或它有来自多个来源的同一部电话(例如Google和Whatsapp),您将获得同一个CONTACT_ID电话多一次。

解决方案是使用HashMap (而不是HashSet ),其中键是CONTACT_ID ,因此您可以为每个联系人显示多个电话:

 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 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 phones = new ArrayList<>(); } 

如果要按名称对HashMap进行排序:

 List values = new ArrayList<>(contacts.values()); Collections.sort(values, new Comparator { 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); } } 

您可以尝试使用HashSet

公共类HashSet扩展AbstractSet实现Set,Cloneable,Serializable

  • 不允许重复值。

代码结构

  HashSet hashSET = new HashSet(); hashSET.add("AA"); hashSET.add("BB"); hashSET.add("CC"); hashSET.add("AA"); // Adding duplicate elements 

然后

 Iterator j = hashSET.iterator(); while (j.hasNext()) System.out.println(j.next()); // Will print "AA" once. } 

现在使用TreeSet您的Hashset值进行SORT

TreeSet实现SortedSet接口,因此不允许重复值。

  TreeSet _treeSET= new TreeSet(hashSET); 

可能在您的联系人中有多个群组,该群组将是WhatsApp,Google等。转到您的联系人并搜索具有whatsApp帐户的联系人 。 将显示与不同组的双重输入

你应该在Bean使用或更改你的ContactsBean使用HashSet

注意: HashSet可以避免重复输入

HashSet只包含唯一元素,它可以避免使用相同的键元素formsHashSet

示例 bean

 public class ContactBean { private HashSet number = new HashSet(); public void setNumber(String number) { if (number == null) return; this.number.add(number.trim()); } public HashSet getNumber() { return this.number; } } 

简单的例子

 //Creating HashSet and adding elements HashSet hashSet=new HashSet(); hashSet.add("Dhruv"); hashSet.add("Akash"); hashSet.add("Dhruv"); //Avoiding this entry hashSet.add("Nirmal"); //Traversing elements Iterator itr = hashSet.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } 

您可以使用HashSet来避免重复: –

 HashSet hset = new HashSet(); 

你可以在HashSet添加类似ArrayList : –

 hset.add(your_string); 

要么

ArrayList转换为HashSet : –

 Set set = new HashSet(your_arraylist_object); 

HashSet避免重复输入:)

我不知道你为什么从联系人那里得到重复的项目,也许手机联系人已经有重复的值。你可以在联系人应用程序中查看。

您应该始终使用设置数据结构,以避免重复项目。 你可以在这里find更好的解释和例子。

我认为您的重复是因为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在键/值对中添加项目,并从项目集中删除重复的条目。

 List phone_num_list= new ArrayList<>(); // add elements to phone_num_list, including duplicates Set hs = new HashSet<>(); hs.addAll(phone_num_list); phone_num_list.clear(); phone_num_list.addAll(hs); 

快乐的编码!!