Как из одного массива вычесть другой
Перейти к содержимому

Как из одного массива вычесть другой

  • автор:

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

Операция «вычитания» массива из массива сводится к перебору на наличие элементов первого массива во втором. Разность двух массивов даст нам элементы первого массива, которых нет во втором. Рассмотрим пример на плоских структурах. «Вычтем» из массива A массив B c помощью методов массивов — filter() и includes()

const arr_A = [1, 2, 3, 4, 5, 6, 7]; const arr_B = [5, 6, 7, 8, 9, 10]; const result = arr_A.filter(el_A => !arr_B.includes(el_A)); // Результат: [1, 2, 3, 4] 

Более сложный пример, с вложенными структурами. Необходимо произвести вычитание, но только лишь по одному из ключей, например по полю name. Для этого удобно применить метод some().

const arr_A = [name: 'Ivan', age: 32>, name: 'Nikolay', age: 24>, name: 'Anna', age: 24>]; const arr_B = [name: 'Nikolay', age: 24>]; const result = arr_A.filter(person_A => !arr_B.some(person_B => person_A.name === person_B.name)); // Результат [ < name: 'Ivan', age: 32 >, < name: 'Anna', age: 24 >] 

Также можно воспользоваться методом из библиотеки Lodash — difference

_.difference([5, 2, 1], [2, 3]); // Результат => [5, 1] 

15 марта 2023

Вычитание массива из другого массива в буквальном смысле (как математическая операция) не совсем корректная операция. Обращаясь ко всему массиву мы получаем ссылку в памяти, где хранится данный массив.

[1, 2, 3] - [1, 2, 3]; // NaN 

Мы получили NaN (not a number) как результат операции вычитания. И это логично, ведь результат не представляет собой математически корректную операцию.

Однако, мы можем провести вычитание элементов этих массивов. Это просто, когда мы знаем точно о том, что хранится в этих массивах, сколько элементов содержит каждый.

const arrA = [100, 500]; const arrB = [101, 505]; console.log(arrA[0] - arrB[1]); // корректная операция 

Другие, более сложные случаи вычитания элементов двух массивов зависят от задачи и могут решаться по-разному.

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

Необходимо найти разницу, те сравнить 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

Отслеживать
Ivan Stasiuk
задан 9 июл 2016 в 17:01
Ivan Stasiuk Ivan Stasiuk
470 1 1 золотой знак 4 4 серебряных знака 22 22 бронзовых знака

Нужно больше деталей. Важен ли порядок, возможно ли дублирование значений в исходных массивах. В самом простом случае вам поможет Set.removeAll , но он не сохраняет порядок и не допускает дублирования элементов

9 июл 2016 в 17:35
@soon обновил описание.
9 июл 2016 в 17:41

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

final int[] a1 = ; final int[] a2 = ; List intList = new ArrayList() >; List intList_2 = new ArrayList() >; intList.removeAll(intList_2); for (int a : intList) System.out.println(a); 

Отслеживать
ответ дан 9 июл 2016 в 18:20
Shwarz Andrei Shwarz Andrei
12k 1 1 золотой знак 20 20 серебряных знаков 40 40 бронзовых знаков
Насколько я понимаю, ваш вариант в итоге выводит List, не хватает обратного преобразования.
9 июл 2016 в 18:29

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

Проблема лишь в том, как нормально создать Set из массива. Стандартный конструктор HashSet принимает Collection , поэтому необходимо преобразовать int[] в список (к примеру). Если есть поддержка Google Guava, то можно воспользоваться стандартным методом Ints.asLists . Его сложность в документации не указана, но если заглянуть в реализацию, то можно увидеть, что это О(1):

int[] m1 = new int[]; int[] m2 = new int[]; Set s = new HashSet<>(Ints.asList(m1)); s.removeAll(Ints.asList(m2)); s.forEach(System.out::println); 

В противном случае можно создать свой метод для создания множества из целочисленного массива:

public static Set asSet(int[] arr) < Sets = 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); 

Вычесть массив из массива

Author24 — интернет-сервис помощи студентам

Вычесть из одного массива байт другой массив байт
Здравствуйте! Подскажите что нужно сделать чтобы из одного массива байт вычесть другой массив байт!

Поэлементно случайным образом сложить или вычесть 2 массива и получить 3 массив
Задача: Как поэлементно случайным образом сложить или вычесть 2 массива и получить 3 массив

Дан массив, из всех положительных чисел вычесть первый элемент массива
Помогите пожелуйста: Дан массив, из всех положительных чисел вычесть первый элемент массива, из.

Эксперт .NET

5872 / 4749 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361

Лучший ответ

Сообщение было отмечено Maveath как решение

Решение

1 2 3
int[] arr1 = { 1, 2, 3, 4, 5 }; int[] arr2 = { 1, 2, 8, 4, 5, 6, 7, 5, 7 }; int[] arr3 = arr2.Exceptint>(arr1).ToArrayint>(); //из arr2 вычитаем arr1

Регистрация: 19.08.2015
Сообщений: 27
Даценд, Спасибо, очень элегантно, а не знаете асимптотическую сложность данного способа?
746 / 487 / 187
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2

bullock, Except реализуется через коллекцию Set , сначала добавляя туда элементы из arr1, а затем — из arr2, что будет соответствовать логарифмической сложности. Ну а ToArray — просто копирование элементов коллекции, а значит линейная сложность от количества элементов в получившемся на предыдущем этапе множества.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Считать данные из txt файла, записать их в массив и вычесть значения одного массива из другого
Срочно нужна помощь. Никак не могу разобраться был файл с данными в формате нескольких столбцов с.

Дан массив R(N,M). Вычесть из каждого положительного элемента массива сумму номеров строки и столбца в которой
Дан массив R(N,M). Вычесть из каждого положительного элемента массива сумму номеров строки и.

Как вычесть из каждого элемента одномерного массива каждый элемент другого массива
Есть два одинаковых динамически заданных одномерных массива, число их элементов задается.

Или воспользуйтесь поиском по форуму:

forum.lissyara.su

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.

  • Отправить тему по email
  • Версия для печати

Первое новое сообщение • 3 сообщения • Страница 1 из 1
Podedinov мл. сержант Сообщения: 84 Зарегистрирован: 2008-12-28 11:50:19

Вычетание одного массива из другого

  • Пожаловаться на это сообщение
  • Цитата

Вот вопрос как можно вычесть один массив и из другого, допустим:

@a=(1,2,3,4,5,6,7,8,9); @b=(1,2,3,4,5); @a-@b=@c=(6,7,8,9); 
Podedinov

Хостинг HostFood.ru

Услуги хостинговой компании Host-Food.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Гость проходил мимо

Re: Вычетание одного массива из другого

  • Пожаловаться на это сообщение
  • Цитата

Непрочитанное сообщение Гость » 2010-04-08 15:47:53

В инете нашлось вот:

my @small = ( 1, 2, 3, 4, 5 ); my @big = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ); my @res; my %h; foreach (@small) < $h= 1; > foreach (@big) < push @res, $_ unless (defined($h)); > 

в @res — результат

Гость

ProFTP подполковник Сообщения: 3388 Зарегистрирован: 2008-04-13 1:50:04 Откуда: %&й Контактная информация:

Re: Вычетание одного массива из другого

  • Пожаловаться на это сообщение
  • Цитата
use Quantum::Superpositions; @a = (a,a,1,1,2,3,4,5,6,7,8,9,10); # integers @b = (1,2,4,6,8,10,12,14,16,18,20); # doubled # @c = @a; my @unionAB = sort < $a $b > eigenstates( any(@a, @b) ); my @intersectionAB = sort < $a $b > eigenstates( any(@a) != any(@b) ); my @differenceAB = sort < $a $b > eigenstates( any(@a) != all(@b) ); # print "@intersectionAB\n"; # print " @unionAB \n"; print " @differenceAB \n"; 
$ ./perl.pl a 3 5 7 9 

Pеrl FAQ
perl -e ‘print join»»,map $$_[rand@$_],([0..9,’a’..’z’,’A’..’Z’])x30′
ИзображениеИзображение

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *