HashSet添加重复的字符串

时间:2015-09-03 12:04:15

标签: java android duplicates hashset

我正在尝试从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;
        }
    }

但是会发生这种情况:

  1. 电话= 0502809903
  2. 电话= +971556072980
  3. 拒绝电话= +971556072980&lt; - 拒绝重复
  4. 电话= +971552767944
  5. 电话= +971556072980&lt; - 接受重复
  6. 编辑: 如果字符串是这样创建的,那么它可以工作但是我从光标获得的字符串不会。

        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数组,如何解决?

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

2 个答案:

答案 0 :(得分:1)

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

<德尔> boolean isNumberAdded = newNumbers.add(phone.trim());

这应该可以解决问题。

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

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

让我知道这次是否有效。

答案 1 :(得分:-2)

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

您将需要覆盖hashcode并等于。

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