我正在尝试从android中的联系人提供程序获取唯一的电话号码,并且我正在使用HashSet来添加联系人的不同电话号码

   Set<String> newNumbers = new HashSet<>();

   while(findNumbers.moveToNext()){
      String phone = findNumbers.getString(0);
      phone = phone.replaceAll("[\\s\\-()]", "");
      boolean isNumberAdded = newNumbers.add(phone);
      if(isNumberAdded){
         Log.d(TAG,"Phone= " + phone);
       }else{
         Log.d(TAG,"Rejected Phone= " + phone);
         continue;
        }
    }


然而,这发生了:


电话= 0502809903
电话=‪+971556072980‬
拒绝电话=‪+971556072980‬电话= +971552767944
电话= +971556072980

编辑:
如果以这种方式创建字符串,那么它可以工作,但是我从游标中获取的字符串却不能。

    ArrayList<String> testing = new ArrayList<String>();
    testing.add("0502809903");
    testing.add("+971556072980");
    testing.add("+971556072980");
    testing.add("+971552767944");
    testing.add("+971556072980");

    Set<String> numbers = new HashSet<>();
    for(String data: testing){

        boolean isNumberAdded = numbers.add(data);
        if(isNumberAdded){
            Log.d("Test","Accepted " + data);
        }else{
            Log.d("Test","Rejected " + data);
        }
    }


Edit2:将数字显示为char数组,如何解决?


原始= [0、5、0、2、8、0、9、9、0、3]
接受的电话= 0502809903
原始= [‪,+,9,7,1,5,5,6,0,7,2,9,8,0,‬]
接受的电话=‪+971556072980‬
原始= [‪,+,9,7,1,5,5,6,0,7,2,9,8,0,‬]
拒绝电话=‪+971556072980‬
原始= [+,9、7、1、5、5、2、7、6、7、9、4、4]
接受的电话= +971552767944
原始= [+,9,7,1,5,5,6,0,7,2,9,8,0]
接受的电话= +971556072980

最佳答案

您的字符串中有垃圾。尝试这个:

boolean isNumberAdded = newNumbers.add(phone.trim());

这应该可以解决问题。

编辑:
也许不是。根据this question,如果要删除不可打印的字符,则应使用以下命令:

boolean isNumberAdded = newNumbers.add(phone.replaceAll("\\p{C}", ""));


让我知道这一次是否有效。

09-10 15:50