我正在尝试从 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;
}
}
但是这种情况发生了:
- 电话= 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
最佳答案
你的字符串中有垃圾。 试试这个:
boolean isNumberAdded = newNumbers.add(phone.trim());
这应该可以解决问题。
编辑: 或者也许它没有……根据this question ,如果你想删除不可打印的字符,你应该使用以下内容:
boolean isNumberAdded = newNumbers.add(phone.replaceAll("\\p{C}", ""));
让我知道这次是否有效。
关于java - HashSet 添加重复字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32375138/