循环没有捕获重复项并在 Android(Java) 中删除它们
Posted
技术标签:
【中文标题】循环没有捕获重复项并在 Android(Java) 中删除它们【英文标题】:Loop is not catching duplicates and removing them in Android(Java) 【发布时间】:2016-03-21 23:46:36 【问题描述】:我最近开始使用 android 和 Java 进行编程,所以请多多包涵。
我编写了一个循环,在将新姓名和电话号码添加到列表和隐藏数组之前,应该删除之前找到的所有重复项。使用当前方法,我仍然会不断重复,当单击按钮再次添加所有相同的联系人时,我会再次获得所有联系人。这让我觉得重复检查方法根本无法正常工作,但我没有得到任何帮助
我有两个在外面创建的列表数组:
List<String> phnnumbers = new ArrayList<String>();
List<String> names = new ArrayList<String>();
这是添加联系人方法:
public void AddAllContacts(View view)
try
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (phones.moveToNext())
String linesp = System.getProperty("line.separator");
TextView quantityTextView = (TextView) findViewById(R.id.numbersview);
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
duplicatecheck(name, phoneNumber);
addthistothelist(name, phoneNumber);
phones.close();
catch (Exception e)
e.printStackTrace();
这是重复检查方法:
public void duplicatecheck(String name,String phoneNumber)
for (int i=0;i<phnnumbers.size();i++)
String thenumber = phnnumbers.get(i);
String thename= names.get(i);
if(thenumber.equals(phoneNumber))
phnnumbers.remove(i);
names.remove(i);
TextView quantityTextView = (TextView) findViewById(R.id.numbersview);
String textpost = quantityTextView.getText().toString();
String newtextpost = textpost.replaceAll(thenumber, "UNBELIEVABLEEE");
String secondtextpost = newtextpost.replaceAll(thename, "UNBELIEVABLE");
quantityTextView.setText(secondtextpost);
NumberOfContactsAdded--;
这是在检查重复并删除后被调用的方法,下一个方法是下一个添加数字和名称的方法:
public void addthistothelist(String nameofperson,String NumberOfPerson)
String linesp = System.getProperty("line.separator");
TextView quantityTextView = (TextView) findViewById(R.id.numbersview);
String textpost = quantityTextView.getText().toString();
NumberOfPerson = NumberOfPerson.replaceAll("[^0-9]", "");
if(NumberOfPerson.contains("+1"))
phnnumbers.add(NumberOfPerson);
names.add(nameofperson);
NumberOfContactsAdded++;
quantityTextView.append(linesp+nameofperson+" " +NumberOfPerson);
else
NumberOfPerson= "+1"+NumberOfPerson;
phnnumbers.add(NumberOfPerson);
names.add(nameofperson);
NumberOfContactsAdded++;
quantityTextView.append(linesp+nameofperson+" " +NumberOfPerson);
我真的不知道我可能做错了什么。我会尝试清理此代码,但它甚至无法正常工作。
【问题讨论】:
【参考方案1】:我没有使用 android 编程的经验,但我可以看到的一件事是,您在迭代 phnnumbers 时正在从 phnnumbers 中删除元素,您不应该这样做。要么使用迭代器,要么将元素/元素索引添加到列表中,然后在遍历 phnnumbers 后将它们从 phnnumbers 中删除。
【讨论】:
我认为我的问题与Android没有太大关系,只是java本身。那么我是否可以通过在开始检查之前放置一个等于 phnnumbers 大小的新变量来解决这个问题,并使用它而不是它的 .size() 或者这不起作用? 使用 for (int i....在您调用 remove (i) 后,i 将是一个新对象,但随后您继续循环,并跳过此新元素。对于其他集合,行为会有所不同,因此为了将来参考,最好使用迭代器的 remove方法,或“记住”要删除的索引/对象,并在完成迭代后删除它们【参考方案2】:你可以这样做:
为person创建一个bean类
公共类人 私有字符串名称; 私人字符串电话;
public Person(String name, String phone)
this.name = name;
phone = phone.replaceAll("\\W+", "");
phone = "+1"+phone;
this.phone = phone;
@Override
public boolean equals(Object o)
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Person person = (Person) o;
return name != null ? name.equals(person.name) : person.name == null && (phone != null ? phone.equals(person.phone) : person.phone == null);
@Override
public int hashCode()
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (phone != null ? phone.hashCode() : 0);
return result;
然后遍历所有的联系人,放到一个集合中,它会自动避免重复
Set<Person> persons = new HashSet<>();
public void AddAllContacts(View view)
try
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (phones.moveToNext())
String linesp = System.getProperty("line.separator");
TextView quantityTextView = (TextView) findViewById(R.id.numbersview);
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Person person = new Person(name, phoneNumber);
persons.add(person);
phones.close();
// 在这里你可以用 Person's Set 做什么 捕获(异常 e) e.printStackTrace();
【讨论】:
好吧,这是有道理的。我如何在不同的字符串中获取每个人的姓名和电话号码?我试图让它们根据哈希集的大小循环遍历每个。因为我将使用需要将其名称和编号分开的命令。我不能在其他方法中使用 person.name 或 person.phoneNumber 一旦你有了一组person,然后你迭代这个set,获取每个Person对象,然后把这个Person对象交给另一个方法。 对不起,我不确定我会怎么做?Iterator<String> it = hset.iterator(); while(it.hasNext()) System.out.println(it.next());
那是如何迭代的,但是我如何将它交给另一个方法或将其更改为不同的类型?
for (String person : persons) System.out.println("name = " + person.getName+", phone = "+person.getPhone());
我仍然没有看到如何将它用于我想做的事情。我试图使用该数组中名称数量大小的循环,遍历每个并运行sms.sendTextMessage(NumberOfPerson, null, Message, null, null);
在某处的消息中使用该特定名称的数量。即使我创建了一个将名称/电话作为字符串返回的方法,getName() 和 getPhone 也会给我错误。对不起,我以前从未使用过迭代器或哈希集以上是关于循环没有捕获重复项并在 Android(Java) 中删除它们的主要内容,如果未能解决你的问题,请参考以下文章
将键添加到 json 文件,删除重复项并在 javascript 中写入 json 文件
OpenCV - 在捕获循环中没有显示没有等待键的图像[重复]