#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) { Listlist_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}; ListintList = 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);
Комментариев нет:
Отправить комментарий