HashSet 添加重复字符串

HashSet adding duplicate Strings

我正在尝试从 android 中的联系人提供者处获取唯一的 phone 号码,并且我正在使用 HashSet 添加联系人的不同 phone 号码

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

然而这种情况发生了:

  1. Phone= 0502809903
  2. Phone= +971556072980
  3. 拒绝 Phone= +971556072980 <- 拒绝重复
  4. Phone= +971552767944
  5. Phone= +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:将数字显示为字符数组,我该如何解决?

  1. 原始 = [0, 5, 0, 2, 8, 0, 9, 9, 0, 3]
  2. 已接受 Phone= 0502809903
  3. 原=[+,9,7,1,5,5,6,0,7,2,9,8,0,]
  4. 已接受 Phone= +971556072980
  5. 原=[+,9,7,1,5,5,6,0,7,2,9,8,0,]
  6. 已拒绝 Phone= +971556072980
  7. 原=[+,9,7,1,5,5,2,7,6,7,9,4,4]
  8. 已接受 Phone= +971552767944
  9. 原=[+,9,7,1,5,5,6,0,7,2,9,8,0]
  10. 已接受 Phone= +971556072980

HashSet 将使用 GetHashCode 和 Equals 来确定您的对象是否相等。现在,由于您没有覆盖这些方法,因此将使用默认的 System.Object 引用相等性。每次添加新值时,它都是一个唯一的对象实例,因此 HashSet 将其视为一个唯一的对象。

您将需要覆盖哈希码和相等。

Why is it important to override GetHashCode when Equals method is overridden?

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

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

这应该可以解决问题。

编辑: 或者它可能不...根据 this question,如果你想删除不可打印的字符,你应该使用以下内容:

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

让我知道这次是否有效。