2015-11-20 65 views
5

我有一个数组列表。如何比较阵列列表与移动联系人

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中的数字。我知道在条件我必须得到数组的价值,但是当我尝试这样做,我没有得到我的联系的其余部分。

在此先感谢

+0

什么是你面对这个代码的问题,任何异常或任何错误? – Anjali

+0

不,我只有一个单一的联系人 –

回答

6

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

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

,并在下面一行此列表使用Ĵ++之前添加的号码;

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

现在的店铺名称和PhoneNumber这样的:

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

希望这会解决您的问题。

+0

感谢@Anjali为您提供宝贵的答案。但是当我试图使用解决方案,所以我得到异常在“如果条件” –

+0

异常是java.lang.IndexOutOfBoundsException:索引3无效,大小为3它是来这里尝试if(mysql_ar.contains(numberList。 get(j))){ //什么都不做 } else { Log.e(“num”,numberList.get(j)); } } catch(Exception ex){} –

+0

更新您的代码,以便我们检查代码 – Anjali

1

一个理想的解决方案是使用搭扣地图

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

这将作为哈希表不会有duplicatesand当u试图插入重复键,你就会知道,

编辑 我觉得你的代码可能有这方面的工作解决

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





       } 
+0

感谢@Abx其实我正在考虑使用哈希映射或集合,但我更新使用它之前,你可以请给我更多的想法如何使用 –

+1

@Abx即使你的代码是错误的。如果您正在比较当前数字,那么迭代j需要什么? – Anjali

+0

@Anjali明白了你的观点......已编辑它 – Abx

1

尝试如下,不要忘了清除列表,当过水再利用

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 
} 

} 
+0

谢谢@venkatesh为您的答案,但我有一个疑问是,在“如果条件”你给一个变量是yournumber但在我的问题yournumber是一个数组列表是我比较它是这样吗? –

+0

Nopes,它取决于你必须进行比较。列表中有你正在从光标读取的所有数字,for循环中可以比较列表中的每个和evry项目 –