我正在尝试从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;
}
}
但是会发生这种情况:
编辑: 如果字符串是这样创建的,那么它可以工作但是我从光标获得的字符串不会。
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 :(得分: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?