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;
}
}
然而这种情况发生了:
- Phone= 0502809903
- Phone= +971556072980
- 拒绝 Phone= +971556072980 <- 拒绝重复
- Phone= +971552767944
- 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:将数字显示为字符数组,我该如何解决?
- 原始 = [0, 5, 0, 2, 8, 0, 9, 9, 0, 3]
- 已接受 Phone= 0502809903
- 原=[+,9,7,1,5,5,6,0,7,2,9,8,0,]
- 已接受 Phone= +971556072980
- 原=[+,9,7,1,5,5,6,0,7,2,9,8,0,]
- 已拒绝 Phone= +971556072980
- 原=[+,9,7,1,5,5,2,7,6,7,9,4,4]
- 已接受 Phone= +971552767944
- 原=[+,9,7,1,5,5,6,0,7,2,9,8,0]
- 已接受 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}", ""));
让我知道这次是否有效。
我正在尝试从 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;
}
}
然而这种情况发生了:
- Phone= 0502809903
- Phone= +971556072980
- 拒绝 Phone= +971556072980 <- 拒绝重复
- Phone= +971552767944
- 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:将数字显示为字符数组,我该如何解决?
- 原始 = [0, 5, 0, 2, 8, 0, 9, 9, 0, 3]
- 已接受 Phone= 0502809903
- 原=[+,9,7,1,5,5,6,0,7,2,9,8,0,]
- 已接受 Phone= +971556072980
- 原=[+,9,7,1,5,5,6,0,7,2,9,8,0,]
- 已拒绝 Phone= +971556072980
- 原=[+,9,7,1,5,5,2,7,6,7,9,4,4]
- 已接受 Phone= +971552767944
- 原=[+,9,7,1,5,5,6,0,7,2,9,8,0]
- 已接受 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}", ""));
让我知道这次是否有效。