0

我有一个类 ArrayList,所以当它们的 Autor 相同时,我必须删除重复的关键字,但当它们不同时则不需要。以下代码仅在第一个索引(i = 0)中删除重复项,然后它不会删除任何内容。

谢谢!

例子:

这里我有一个例子:

1 个公私伙伴关系

2个电子电气设备

3 B AAA

4 乙 LL

5A CCC

2个电子电气设备

5A CCC

在这种情况下,我不想删除任何行,因为“A”有不同的父级(2 和 5)。

        int size = ls.size();
    int duplicates = 0;

    // not using a method in the check also speeds up the execution
    // also i must be less that size-1 so that j doesn't
    // throw IndexOutOfBoundsException
    for (int i = 0; i < size - 1; i++) {
        for (int j = i + 1; j < size; j++) {

                    if(ls.get(j).getKeywords().equals(ls.get(i).getKeywords()) && ls.get(j).getAutor().equals(ls.get(i).getAutor()) ){
                        duplicates++;
                        ls.remove(j);}


            // decrease j because the array got re-indexed
            j--;
            // decrease the size of the array
            size--;
        } // for j
    } // fo
4

2 回答 2

0

解决此问题的最佳方法是创建non duplicates. 因此,声明另一个列表并在第一个列表上迭代时检查该列表中是否存在该项目,如果不存在则仅添加该项目。下面是示例源代码。

请注意,我故意使用循环和等于来模拟您的条件。

public static void main(String[] args) throws InterruptedException {
    List<Integer> list = new ArrayList<Integer>();

    for (int i = 0; i < 3; i++) { //Add some duplicates
        list.add(new Integer(4));
        list.add(new Integer(5));
        list.add(new Integer(6));
    }
    List<Integer> newList = new ArrayList<Integer>();
    for (Integer first : list) {
        boolean contains = false;//if this flag is false after iteration then item will be added

        for (Integer copy : newList)
            if (first.equals(copy)) {// You will have to specify your condition here
                contains = true;
                break;
            }
        if(!contains)
            newList.add(first);//add item if it was not present
    }
    System.out.println(list);
    System.out.println(newList);

}

输出:

[4, 5, 6, 4, 5, 6, 4, 5, 6] <-- List with duplicates
[4, 5, 6] <-- List with no duplicates
于 2012-10-13T15:56:14.500 回答
0

您可以按键和后处理对列表进行分组以删除重复项:

使用 Google guava Multimap 和 Function 实现 GroupBy

编辑:

另一种有趣的方法是实现 equals 方法并使用 hashset(或类似),请参阅:

从列表中删除重复项

于 2012-10-13T16:02:56.877 回答