Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Как вычесть массив из массива?

#java #android #массивы


Есть 2 массива int[], содержащие элементы Drawable.

int[] m1 = new int[]{R.drawable.img1, R.drawable.img2, R.drawable.img3}
int[] m2 = new int[]{R.drawable.img1, }


Необходимо найти разницу, те сравнить 2 массива и оставить только неповторяющиеся
элементы.

Порядок не важен. Дублирование значений в массивах исключено. Изначально известно
что М1 содержит 50 элементов М2, их только нужно оттуда убрать.

Долго не было ответа, решил вот так:
Спасибо за помощь.

private int[] delArray(int[] a, int[] b) {
    List list_A = new ArrayList();
    for (int index = 0; index < a.length; index++) {
        list_A.add(a[index]);
    }
    List list_B = new ArrayList();
    for (int index = 0; index < b.length; index++) {
        list_B.add(b[index]);
    }

    list_A.removeAll(list_B);

    int[] ret = new int[list_A.size()];
    for(int i = 0;i < ret.length;i++)
        ret[i] = list_A.get(i);

    return ret;
}

    


Ответы

Ответ 1



Попробуйте так: final int[] a1 = {12, 14, 15, 62, 12, 23}; final int[] a2 = {1, 12, 32, 23, 22}; List intList = new ArrayList() {{ for (int a : a1) add(a); }}; List intList_2 = new ArrayList() {{ for (int a : a2) add(a); }}; intList.removeAll(intList_2); for (int a : intList) System.out.println(a); Итог: 14, 15, 62

Ответ 2



В случае, если порядок элементов неважен и входные массивы не содержат дублирующихся эллементов, то самый простой путь - создать Set из массива и удалить из него все элементы, содержащиеся во втором массиве: Проблема лишь в том, как нормально создать Set из массива. Стандартный конструктор HashSet принимает Collection, поэтому необходимо преобразовать int[] в список (к примеру). Если есть поддержка Google Guava, то можно воспользоваться стандартным методом Ints.asLists. Его сложность в документации не указана, но если заглянуть в реализацию, то можно увидеть, что это О(1): int[] m1 = new int[]{1, 2, 3, 4, 5}; int[] m2 = new int[]{0, 4, 2, 8}; Set s = new HashSet<>(Ints.asList(m1)); s.removeAll(Ints.asList(m2)); s.forEach(System.out::println); В противном случае можно создать свой метод для создания множества из целочисленного массива: public static Set asSet(int[] arr) { Set s = new HashSet<>(); for (int x : arr) { s.add(x); } return s; } Ну а если есть поддержка Java 8 (полагаю, в рамках Android это пока неуместно, но все же), то можно воспользоваться Stream: Set s = IntStream.of(m1).boxed().collect(toSet()); s.removeAll(IntStream.of(m1).boxed().collect(toList())); s.forEach(System.out::println); Если элементов немного, то можно обойтись без множеств а просто проверить все элементы (осторожно: квадратичная сложность): IntStream.of(m1).filter(x -> IntStream.of(m2).noneMatch(y -> x == y)).forEach(System.out::println);

Комментариев нет:

Отправить комментарий