【问题标题】:How to compare an Array List with mobile Contact如何将数组列表与移动联系人进行比较
【发布时间】:2016-02-22 13:05:16
【问题描述】:

我有一个数组列表。

1) 我的第一个 ArrayList<String> some_num = new ArrayList<String>(); 包含这样的值。

[1111111111, 2222222222] 

现在我正在尝试将其与我的移动联系人进行比较。

  Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
  String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER};

                Cursor people = getActivity().getContentResolver().query(uri, projection, null, null, null);

                int indexName = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                int j_count=0;
                String number;
                people.moveToFirst();
                do {

                    String name   = people.getString(indexName);
                     number = people.getString(indexNumber);
                    j_count++;


                    // Do work...
                } while (people.moveToNext());




                for(int j=0;j<=j_count;j++){

                    if (some_num.contains(number)){
                        // do nothing
                    }
                    else{
                    Log.e("num",number);
                    }
                }

我正在尝试从手机电话簿中获取我的 ArrayList 中不存在的那些号码。我知道在 for 条件下我必须获取数组的值,但是当我尝试这样做时,我没有得到我的其余联系人。

提前致谢

【问题讨论】:

  • 你在这段代码中遇到了什么问题,有什么异常或错误吗?
  • 不,我只有一个联系人

标签: android arraylist android-contacts


【解决方案1】:

不要使用任何其他循环来比较数字。参考以下代码:

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
  String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                        ContactsContract.CommonDataKinds.Phone.NUMBER};

                Cursor people = getActivity().getContentResolver().query(uri, projection, null, null, null);

                int indexName = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                int indexNumber = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                int j_count=0;
                String number;
                people.moveToFirst();
                do { 

                    String name   = people.getString(indexName);
                     number = people.getString(indexNumber);

                      if (some_num.contains(number)){
                      }else{
                      }

                    j_count++;


                    // Do work... 
                } while (people.moveToNext());

那你的代码有什么问题?

您正在将您的数组与保存最后一个数字引用的number 变量进行比较。因为你只能得到一个结果。

如果您仍想使用您的代码,则创建另一个 arrayList 来存储所有数字,如下所示:

ArrayList<String> numberList = new ArrayList<String>();

要在此列表中添加数字,请在 j++ 之前使用下面的行;

numberList.add(number);

现在更新您的最后一个迭代器块,使其工作如下:

       for(int j=0;j<numberList.siz();j++){

            if (some_num.contains(numberList.get(i)){
                // do nothing 
            } 
            else{ 
            Log.e("num",numberList.get(i));
            } 
        } 

要获取用户的完整详细信息,您可以创建包含用户详细信息的模型类,如下所示:

public class UserDetails{
    private String userName;
    private String userPhone;
    private String userImage;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPhone() {
        return userPhone;
    }

    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone;
    }

    public String getUserImage() {
        return userImage;
    }

    public void setUserImage(String userImage) {
        this.userImage = userImage;
    }
}

现在你必须在你的活动中使用这个模型来获取和设置用户的详细信息:

ArrayList<UserDetails> mUserDetailList = new ArrayList<UserDetails>();

要获取联系人姓名,请使用以下代码:

  String name   = people.getString(indexName);

现在像这样存储姓名和电话号码:

UserDetails mUserModel = new UserDetails();

mUserModel.setUserPhone(number);
mUserModel.setUserName(name);

mUserDetailList.add(mUserModel);

现在检查号码是否存在:

 for(int j=0;j<mUserDetailList.siz();j++){

            if (some_num.contains(mUserDetailList.get(i).getUserPhone()){ 
                // do nothing  
            }  
            else{  
            Log.e("num",numberList.get(i).getUserPhone());
            Log.e("name",numberList.get(i).getUserName());
            }  
        }  

希望这能解决您的问题。

【讨论】:

  • 感谢@Anjali 的宝贵回答。但是当我尝试使用解决方案时,我在“if condtion”时得到了异常
  • Exception is java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3 it is come here try { if (mysql_ar.contains(numberList.get(j))) { // do nothing } else { Log.e("num", numberList.get(j)); } }catch(异常前){}
  • 更新您的代码,以便我们检查代码有什么问题
  • 现在检查。 If 语句有问题。现在它可以正常工作了
  • 感谢@Anjali 感谢您的帮助,它现在可以正常工作了。太好了,非常感谢您。
【解决方案2】:

一个理想的解决方案是使用hasp map

将整个联系人存储在哈希映射中作为键 并通过简单地尝试将值放入哈希映射来检查您的列表是否具有这些数字。

这将起作用,因为哈希映射不会有重复项,当您尝试插入重复键时,您会知道

编辑 我认为您的代码可能适用于此修复程序

               String number;
                people.moveToFirst();
                do {

                    String name   = people.getString(indexName);
                     number = people.getString(indexNumber);
                 // for(int j=0;j<=j_count;j++){

                    if (some_num.contains(number)){
                        // do nothing
                    }
                    else{
                    Log.e("num",number);
                    //}
                    j_count++;


                    // Do work...
                } while (people.moveToNext());





                }

【讨论】:

  • 谢谢@Abx 实际上我正在考虑使用哈希映射或集合,但我之前使用过它,你能告诉我如何使用它
  • @Abx 即使你的代码是错误的。如果您要比较当前数字,需要对 j 进行迭代吗?
  • @Abx 但如果您查看他定义的代码 j_count 以获取电话联系人的大小。他没有从服务器获取联系人数组的长度。
【解决方案3】:

尝试如下,重复使用时不要忘记清除列表

ArrayList<String>  list = new ArrayList<String>();

 people.moveToFirst();
                do {

                    String name   = people.getString(indexName);
                     number = people.getString(indexNumber);
                     list.add(number);
                    j_count++;


                    // Do work...
                } while (people.moveToNext());

for(String str:list)
{

  if(yournumber.equalsIgnoreCase(str))
{ 
    //do your stuff
}

}

【讨论】:

  • 感谢@venkatesh 的回答,但我有一个疑问是,在“如果条件”中,您给出的一个变量是您的号码,但在我的问题中,您的号码是一个数组列表,我是这样比较的吗?
  • 不,这取决于您必须比较的内容。列表包含您从光标读取的所有数字,在 for 循环中您可以比较列表中的每个项目和每个项目
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 2018-06-02
  • 2015-08-04
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多