Как бы я удалил дубликаты из Arraylist ? (Java) - PullRequest
1 голос
/ 08 апреля 2020

Вопрос говорит обо всем на самом деле. Я пытался использовать LinkedHashSet, но это не сработало. Если я не ошибаюсь, сравнения выполнялись неправильно из-за того, что он сравнивал целочисленные массивы.

Моя цель - создать метод removeDuplicates (* ArrayList ) stati c. Метод должен сравниваться на основе содержимого массивов. Моя попытка до сих пор:

import java.util.ArrayList;
import java.util.LinkedHashSet;

public class test {
    public static void main(String[] args) {
        ArrayList<Integer[]> arrayList = new ArrayList<>();

        Integer[] array1 = new Integer[2];
        array1[0] = 1;
        array1[1] = 4;

        Integer[] array2 = new Integer[2];
        array2[0] = 1;
        array2[1] = 4;

        arrayList.add(array1);
        arrayList.add(array2);

        LinkedHashSet<Integer[]> hashSet = new LinkedHashSet<>(arrayList);

        ArrayList<Integer[]> listWithoutDuplicates = new ArrayList<>(hashSet);

        System.out.println("Number of elements before using linkedhashset: " + arrayList.size());
        System.out.println("number of elements after: (expecting 1) " + listWithoutDuplicates.size());
    }
}

дает результат:

Number of elements before using linkedhashset: 2
number of elements after (expecting 1):  2

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Вы можете использовать следующий подход

List<Integer[]> listWithoutDuplicates = arrayList.stream()
            .map(arr -> Arrays.asList(arr))
            .distinct()
            .map(list -> list.toArray(new Integer[0]))
            .collect(Collectors.toList());

Хитрость в том, что отображение Integer[] в List<Integer> позволяет использовать метод List::equals(), который может определить, равны ли два списка (= "оба содержат одинаковые элементы в одинаковом порядке "). В сочетании с Stream::distinct(), который обрезает дубликаты, а затем каждый уникальный List преобразуется обратно в Integer[].

3 голосов
/ 08 апреля 2020

Возможным решением будет сохранение количества вхождений каждого числа в каждом массиве в списке, чтобы учесть дублирующиеся числа, и проверить, был ли этот экземпляр уже добавлен или нет:

private static List<Integer[]> removeDuplicates(List<Integer[]> list) {
        List<HashMap<Integer,Integer>> instances = new ArrayList<>();
        List<Integer[]> res = new ArrayList<>();
        for(Integer[] arr : list) {
            HashMap<Integer,Integer> map = new HashMap<>();
            for(Integer num : arr) {
                if(map.containsKey(num))
                    map.replace(num, map.get(num)+1);
                else
                    map.put(num,1);
            }
            if(!instances.contains(map)) {
                instances.add(map);
                res.add(arr);
            }
        }
        return res;
}
...