添加重复字符串的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;
}
}
然而,这种情况会发生:
- 电话=0502809903
- 电话=+971556072980 李>
- 被拒绝的电话=+971556072980 <;-拒绝的副本
- 电话:+971552767944
- 电话=+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]
- 接受电话=0502809903
- 原件=[, +, 9, 7, 1, 5, 5, 6, 0, 7, 2, 9, 8, 0, ] 李>
- 接受电话=+971556072980 李>
- 原件=[, +, 9, 7, 1, 5, 5, 6, 0, 7, 2, 9, 8, 0, ] 李>
- 被拒绝的电话=+971556072980 李>
- 原文=[+,9,7,1,5,5,2,7,6,7,9,4,4]
- 接受电话=+971552767944
- 原文=[+,9,7,1,5,5,6,0,7,2,9,8,0]
- 接受电话=+971556072980
# 1 楼答案
你的字符串中有垃圾
试试这个:boolean isNumberAdded = newNumbers.add(phone.trim());
这应该可以做到德尔>编辑: 或者也许它不。。。根据this question,如果要删除不可打印字符,应使用以下命令:
这次让我知道它是否有效
# 2 楼答案
HashSet将使用GetHashCode和Equals来确定对象的相等性。现在,由于您没有覆盖这些方法,因此默认系统是。将使用对象的引用等式。每次添加新值时,它都是唯一的对象实例,因此哈希集将其视为唯一的对象
您需要重写hashcode和equal
Why is it important to override GetHashCode when Equals method is overridden?