仅使用for循环删除ArrayList中的重复项

时间:2018-10-23 08:26:52

标签: java arraylist

您将获得以下数字序列, 1、652、5、15、385、4、55、666、13、2、4658、9、55,-588、10、1083、17、4。 您只能通过使用For循环和ArrayList来删除重复的数字。

public class Ex {
    public static void main(String[] args) {

        ArrayList list = new ArrayList();
        list.add(1);
        list.add(652);
        list.add(5);
        list.add(15);
        list.add(385);
        list.add(4);
        list.add(55);
        list.add(666);
        list.add(13);
        list.add(2);
        list.add(4658);
        list.add(9);
        list.add(55);
        list.add(-588);
        list.add(10);
        list.add(1083);
        list.add(17);
        list.add(4);


        System.out.println("Before remove : " + list);

        for (int i = 0; i < list.size(); i++) {
            for (int j = 1; j < list.size(); j++) {
                if (list.get(i) == list.get(j)) {
                    list.remove(j);
                }
            }
        }
        System.out.println("After remove duplicate items : "+list);
    }
}

输出

Before remove : [1, 652, 5, 15, 385, 4, 55, 666, 13, 2, 4658, 9, 55, -588, 10, 1083, 17, 4]
After remove duplicate items : [1, 5, 385, 55, 13, 4658, -588, 1083, 4]

缺少一些未重复的项目。例10和652。

5 个答案:

答案 0 :(得分:4)

您有很多问题:

  1. 您将在i == j时删除非重复记录。为避免内部循环应以int j = i + 1开头。
  2. 删除记录时,应减少j,因为删除的元素之后的所有元素都向下移动了一个索引。
  3. 您应该将Integerequals(而不是==)进行比较

答案 1 :(得分:1)

内部循环始终以\d{1,2}开始,这意味着您将删除列表中除索引0之外的所有单个元素。您应改为让j = 1。然后,内部循环将仅检查列表的以下元素,而不检查您要比较的元素。删除后,应使用j = i + 1,以便下一个元素的索引对应于j。比较原始类型(j--时可以使用==。比较引用类型(int)时可以使用Integer

这是我的建议:

equals

答案 2 :(得分:0)

其他值是15还是666?您确定期望输出正确吗? 最好使用Iterator从列表中删除元素:

public static ArrayList<Integer> removeDuplicates(ArrayList<Integer> numbers) {
    ListIterator<Integer> it = numbers.listIterator();
    numbers.removeIf(num -> isDuplicated(numbers, it.previousIndex(), num));
    return numbers;
}

private static boolean isDuplicated(ArrayList<Integer> numbers, int toPos, int val) {
    for (int pos = 0; pos < toPos; pos++)
        if (numbers.get(pos) == val)
            return true;

    return false;
}

输出:

Before remove : [1, 652, 5, 15, 385, 4, 55, 666, 13, 2, 4658, 9, 55, -588, 10, 1083, 17, 4]
After remove duplicate items : [1, 652, 5, 15, 385, 4, 55, 666, 13, 2, 4658, 9, 55, -588, 10, 1083, 17, 4]

答案 3 :(得分:0)

public class ArrayListExample {
    public static void main(String[] args) {
        // ArrayList with duplicate elements
        ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));
        System.out.println(numbersList);
        Log.d("DBG",numbersList+"");
        // ArrayList without duplicate elements
        LinkedHashSet<Integer> hashSet = new LinkedHashSet<>(numbersList); 
        ArrayList<Integer> listWithoutDuplicates = new ArrayList<>(hashSet);
        System.out.println(listWithoutDuplicates);
        Log.d("DBG",listWithoutDuplicates+"");
    }
}

输出

[1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]

答案 4 :(得分:0)

// Code for Duplicates not allowed ... for upper example
for(int i = 0; i < list.size(); i++) {
            for(int j = i + 1; j < list.size(); j++) {
                if(list.get(i).equals(list.get(j))){
                    list.remove(j);
                    j--;
                }
            }