循环没有捕获重复项并在 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&lt;String&gt; 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 文件

java nextInt() 尝试多次捕获重复输出

等待没有尝试捕获[重复]

OpenCV - 在捕获循环中没有显示没有等待键的图像[重复]

使用 Java 代码在 Android 上捕获屏幕截图 [重复]

Android 捕获异常并在应用崩溃后重启应用