有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

添加重复字符串的java哈希集

我正在尝试从安卓中的联系人提供商那里获取唯一的电话号码,并使用哈希集添加联系人的不同电话号码

   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‬ <;-拒绝的副本
  4. 电话:+971552767944
  5. 电话=+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. 接受电话=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) 个答案

  1. # 1 楼答案

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

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

    这应该可以做到

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

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

    这次让我知道它是否有效

  2. # 2 楼答案

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

    您需要重写hashcode和equal

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