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

时间:2017-12-13 05:42:55

标签: android sorting android-contacts android-cursor

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

这就是我的尝试,

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

任何人都可以帮忙吗?

7 个答案:

答案 0 :(得分:3)

您可以尝试使用HashSet

  

public class HashSet扩展AbstractSet实现Set,   可克隆,可序列化

  • 不允许使用重复的 值。

代码结构

 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 使用TreeSet Hashset 值。

  

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

 TreeSet<String> _treeSET= new TreeSet<String>(hashSET);

答案 1 :(得分:3)

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

您查看重复联系人的原因是您要查询手机而不是联系人

在Android中有3个主要表:

  1. Contacts表 - 每个联系人有一个项目
  2. RawContacts表格 - 每个帐户每个联系人有一个项目(例如Google,Outlook,Whatsapp等) - 多个RawContacts链接到一个Contact
  3. Data表格 - 每个细节都有一个项目(姓名,电子邮件,电话,地址等) - 每个数据项都链接到一个RawContact和多个Data行与每个RawContact
  4. 相关联

    您正在查询CommonDataKinds.Phone.CONTENT_URI Data表格中的CONTACT_ID,因此,如果某个联系人拥有多部手机,并且/或者它有来自多个来源的同一部手机(例如谷歌和Whatsapp)你将获得相同的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<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<>(); } ,因此您可以为每个联系人显示多个电话:

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

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

    when(variable) {
        null -> doOtherThingSomething()
        else -> doSomething(variable)
    }
    

答案 2 :(得分:2)

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

的双重输入

您应该在ContactsBean使用Bean

中使用或更改HashSet
  

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

     

HashSet仅包含唯一元素,它可以避免使用相同的关键元素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());
} 

答案 3 :(得分:1)

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

HashSet<String> hset = 
               new HashSet<String>();

您可以在ArrayList中添加HashSet: -

hset.add(your_string);

OR

将您的ArrayList转换为HashSet: -

Set<String> set = new HashSet<String>(your_arraylist_object);

HashSet避免重复录入:)

答案 4 :(得分:1)

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

您应始终在任何需要避免重复项目的地方使用设置数据结构。您可以找到更好的解释和示例here

答案 5 :(得分:0)

我认为您的重复是因为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);

                    } 

这将检查前一个号码是否与旧号码相同而不是跳过它。我希望你得到你的答案

答案 6 :(得分:0)

HashSet在键/值对中添加项目,并从项目集中删除重复的条目。

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

快乐的编码!!