Как найти одинаковые элементы двух массивов

Создал два массива, которые сам же прописываю с клавиатуры. Мне надо найти одинаковые элементы этих массивов и вывести их, допустим, в третий массив:

public class Main {
    protected static int[] number1;
    protected static int[] number2;

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("количество массива");
        int size = input.nextInt();
        number1 = new int[size];
        System.out.println("ввести элементы массива");
        for (int i = 0; i < size; i++) {
            number1[i] = input.nextInt();
        }
        System.out.print("Сам массив: ");
        for (int i = 0; i < size; i++) {
            System.out.print(number1[i] + " ");
        }
        System.out.println();
        System.out.println("заполним второй массив ");
        number2 = new int[size];
        for (int i = 0; i < size; i++) {
            number2[i] = input.nextInt();
        }
        System.out.print("Сам массив: ");
        for (int i = 0; i < size; i++) {
            System.out.print(number2[i] + " ");
        }
        // тут я должен начать их сравнивать, но из-за
        // множества новой информации, с таким вроде бы
        // простым вопросом, я через гугл не разобрался 
    }
}

задан 13 июн 2018 в 9:05

Vlad Zherihov's user avatar

Vlad ZherihovVlad Zherihov

3631 золотой знак2 серебряных знака15 бронзовых знаков

Здесь все очень просто. Сначала вы должны выбрать любой массив (например, number1), по которому поочередно будете сравнивать со всеми элементами второго массива, если вы найдете совпадение, то вложенный цикл отменяем командой break(). Вообще это общий случай, который не оптимизирован: если у вас допустим в number1 будут одинаковые элементы, то вы все равно будете сравнивать элементы другого массива.

for (int i = 0; i < number1.length; i++) 
{
    int a = number[i];
    for (int j = 0; j < number2.length; j++) 
    {
        if (a == number2[j]) 
        {
           System.out.println(a);
           break();
        }
    }
}

ответ дан 13 июн 2018 в 9:18

Alex Kleshevnikov's user avatar

1

Ну, или не изобретать велосипед и воспользоваться java.util.Array.equals(number1, number2)

ответ дан 13 июн 2018 в 9:44

Andrew Bystrov's user avatar

Andrew BystrovAndrew Bystrov

7,6521 золотой знак13 серебряных знаков34 бронзовых знака

1

Если нужно именно через массивы, но это топорно не спорю.

public static int[] sameNumbersInArrays(int[] number1,int[] number2) {
       int[] number3 = new int[number1.length];
       int count = 0;

        for (int i = 0; i < number1.length ; i++) {
            if(number1[i] == number2[i]) {
                number3[count] = number1[i];
                count++;
            }
        }

        int[] number4 = new int[count];
        System.arraycopy(number3,0,number4, 0, count);
        return number4;
    }

ответ дан 13 июн 2018 в 14:20

sank's user avatar

sanksank

3772 серебряных знака21 бронзовый знак

Воспользуемся “резиновым” массивом ArrayList<T>, где T – тип элементов, который хранит массив. Пусть arr – переменная типа ArrayList<Integer>. Отмечу, что в угловых скобках не могут быть примитивные типы – только ссылочные. int заменяется на Integer, double – на Double, long – на Long и т. д. (напоминаю, что регистр имеет значение). Этими типами можно работать как с обычными переменными.

Для нашего массива будут справедливы следующие утверждения:

  1. arr.add(a) – добавляет в конец массива элемент a. Он должен конвертироваться в тип T. В нашем случае – в Integer. int в Integer легко преобразуется

  2. arr.contains(a) – проверяет, есть ли элемент a в нашем массиве. Если это так, получаем true, в ином случае – false

  3. arr.sort(null) – сортирует элементы массива по возрастанию. Или по другому правилу, если его указать вместо null

Таким образом, данная задача решается таким образом:

ArrayList<Integer> arr = new ArrayList<Integer>();
        for(int i: number1)
            //начинаем перебирать элементы первого массива
            for(int j: number2)
                //начинаем перебирать элементы второго массива
                if(!arr.contains(i) && i == j)
                    arr.add(i);
        //если элементы совпадают, записываем его в наш массив, если его там ещё нет
        arr.sort(null);
        //сортируем общие элементы. Для удобства
        System.out.println("Общие элементы");
        for(int i: arr) System.out.print(i + " ");

P. S. На самом деле ArrayList не массив, а список.

ответ дан 13 июн 2018 в 10:20

M. Muratov's user avatar

1

Ищем повторяющиеся элементы в двух массивах и собираем в третий массив:

int[] arr1 = {1, 2, 3, 4, 3, 6, 8, 5};
int[] arr2 = {3, 5, 7, 1, 3, 8, 2, 2};

int[] arr3 = Stream.of(arr1, arr2)
        // выкидываем из каждого массива поворяющиеся
        // элементы и объединяем в один Stream<Integer> 
        .flatMap(arr -> Arrays.stream(arr).distinct().boxed())
        // группируем в карту по количеству вхождений
        .collect(Collectors.groupingBy(i -> i, Collectors.counting()))
        // обходим карту
        .entrySet().stream()
        // количество больше одного
        .filter(e -> e.getValue() > 1)
        // получаем сами элементы
        .map(e -> e.getKey())
        // получаем 'int' значения элементов 
        .mapToInt(Integer::intValue)
        // собираем в массив
        .toArray();

// выводим массив повторяющихся элементов
System.out.println(Arrays.toString(arr3)); // [1, 2, 3, 5, 8]

ответ дан 12 дек 2020 в 23:02

Как вариант решения:

int[] numberEq = null;
for (int n : number1) {
    if (Arrays.asList(number2).contains(n)) {
        if (numberEq == null) {
            numberEq = new int[1];
            numberEq[0] = n;
        } else {
            numberEq = Arrays.copyOf(numberEq, numberEq.length + 1);
            numberEq[numberEq.length - 1] = n;
        }
    }
}

Дух сообщества's user avatar

ответ дан 13 июн 2018 в 10:45

JavaJunior's user avatar

JavaJuniorJavaJunior

1,5176 серебряных знаков15 бронзовых знаков

Naturally, my approach was to loop through the first array once and check the index of each value in the second array. If the index is > -1, then push it onto the returned array.

​Array.prototype.diff = function(arr2) {
    var ret = [];
    for(var i in this) {   
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};


My solution doesn’t use two loops like others do so it may run a bit faster. If you want to avoid using for..in, you can sort both arrays first to reindex all their values:

Array.prototype.diff = function(arr2) {
    var ret = [];
    this.sort();
    arr2.sort();
    for(var i = 0; i < this.length; i += 1) {
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

Usage would look like:

var array1 = ["cat", "sum","fun", "run", "hut"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];

console.log(array1.diff(array2));

If you have an issue/problem with extending the Array prototype, you could easily change this to a function.

var diff = function(arr, arr2) {

And you’d change anywhere where the func originally said this to arr2.

0 / 0 / 1

Регистрация: 06.11.2010

Сообщений: 125

1

11.06.2011, 17:43. Показов 15876. Ответов 4


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

Всем привет)
Как можно организовать поиск одинаковых элементов в 2 массивах?
(сам цикл подскажите пож…)
Спасибо заранее)



0



diagon

Higher

1953 / 1219 / 120

Регистрация: 02.05.2010

Сообщений: 2,925

Записей в блоге: 2

11.06.2011, 17:49

2

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
int main(){
    int arr1[] = {1,2,3,4,5},len1 = sizeof(arr1)/sizeof(*arr1);
    int arr2[] = {5,6,7,8,3,10},len2 = sizeof(arr2)/sizeof(*arr2);
    for (int i=0; i < len1 ; i++)
        for (int j=0; j < len2; j++)
            if (arr1[i] == arr2[j]) std::cout << arr1[i] << ' ';
    return 0;
}



0



Mиxaил

541 / 446 / 162

Регистрация: 10.12.2009

Сообщений: 1,857

11.06.2011, 17:50

3

C++
1
2
3
4
5
6
for ( int i = 0; i < SizeOfFirst; i++ )
{
    for ( int j = 0; j < SizeOfSecond; j++ )
        if ( a [ i ] == b [ j ] )
            std::cout << a [ i ] << " ";
}

но элементы могут повторяться, так как тут нет контроля над уже найденными совпадениями…



0



diagon

Higher

1953 / 1219 / 120

Регистрация: 02.05.2010

Сообщений: 2,925

Записей в блоге: 2

11.06.2011, 17:55

4

С контролем

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <map>
int main(){
    int arr1[] = {1,2,3,4,5,3},len1 = sizeof(arr1)/sizeof(*arr1);
    int arr2[] = {5,6,7,8,3,10,3},len2 = sizeof(arr2)/sizeof(*arr2);
    std::map<int,int> m;
    for (int i=0; i < len1 ; i++)
        ++m[arr1[i]];
    for (int i=0; i < len2 ; i++)
        ++m[arr2[i]];
    for (std::map<int,int>::iterator i = m.begin(); i != m.end(); i++)
        if ((*i).second > 1) std::cout << (*i).first << ' ';    
    return 0;
}



0



OstapBender

593 / 531 / 76

Регистрация: 22.03.2011

Сообщений: 1,585

11.06.2011, 18:00

5

можно чуть попроще

C++
1
2
3
4
5
6
7
    for (int i=0; i<len1; i++)
        for (int j=0; j<len2; j++)
            if (arr1[i]==arr2[j])
            m[arr1[i]]=0;
 
    for (std::map<int,int>::iterator it=m.begin(); it!=m.end(); it++)
        std::cout << it->first << ' ';



0



В этом посте мы обсудим, как проверить наличие дубликатов в массиве на C++.

1. Использование набора

Простое и элегантное решение состоит в том, чтобы построить набор из массива, который сохраняет только отдельные элементы. Затем просто сравните размер набора с длиной массива. Если оба не совпадают, то можно сказать, что массив содержит дубликаты. Это работает в линейном времени и пространстве.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <iostream>

#include <unordered_set>

#include <iterator>

int main()

{

    int arr[] = {1, 3, 5, 7, 3, 9};

    int n = sizeof(arr) / sizeof(*arr);

    std::unordered_set<int> distinct(std::begin(arr), std::end(arr));

    bool hasDuplicates = n != distinct.size();

    if (hasDuplicates) {

        std::cout << “Array contains duplicates”;

    } else {

        std::cout << “Array contains no duplicates”;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Array contains duplicates

2. Использование сортировки

Другой вариант — отсортировать массив и сравнить каждую пару последовательных элементов, чтобы проверить наличие дубликатов. Это работает в O(nlog(n)) время, если используется стандартный алгоритм сортировки. Это будет переведено в следующий код:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#include <iostream>

#include <algorithm>

#include <iterator>

int main()

{

    int arr[] = {1, 3, 5, 7, 3, 9};

    std::size_т n = std::distance(std::begin(arr), std::end(arr));

    bool hasDuplicates = false;

    std::sort(std::begin(arr), std::end(arr));

    for (int i = 0; i < n 1; i++) {

        if (arr[i] == arr[i + 1]) {

            hasDuplicates = true;

        }

    }

    if (hasDuplicates) {

        std::cout << “Array contains duplicates”;

    } else {

        std::cout << “Array contains no duplicates”;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Array contains duplicates

3. Использование std::adjacent_find

Лучшим решением является использование std::adjacent_find чтобы найти первое вхождение одинаковых соседних элементов в отсортированном массиве. Он возвращает итератор к первому элегантному дубликату или к концу диапазона, если дубликат не найден.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <iostream>

#include <algorithm>

int main()

{

    int arr[] = {1, 3, 5, 7, 3, 9};

    int n = sizeof(arr) / sizeof(*arr);

    std::sort(arr, arr + n);

    bool hasDuplicates = std::adjacent_find(arr, arr + n) != arr + n;

    if (hasDuplicates) {

        std::cout << “Array contains duplicates”;

    } else {

        std::cout << “Array contains no duplicates”;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Array contains duplicates

 
С C++11 мы можем получить итератор в начало и конец массива:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <iostream>

#include <algorithm>

#include <iterator>

int main()

{

    int arr[] = {1, 3, 5, 7, 3, 9};

    std::size_т n = std::distance(std::begin(arr), std::end(arr));

    std::sort(std::begin(arr), std::end(arr));

    bool hasDuplicates = std::adjacent_find(std::begin(arr), std::end(arr)) != std::end(arr);

    if (hasDuplicates) {

        std::cout << “Array contains duplicates”;

    } else {

        std::cout << “Array contains no duplicates”;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Array contains duplicates

4. Использование std::unique функция

В качестве альтернативы мы можем использовать std::unique функция для удаления последовательных дубликатов после сортировки массива. Его можно использовать следующим образом:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include <iostream>

#include <algorithm>

int main()

{

    int arr[] = {1, 3, 5, 7, 3, 9};

    int n = sizeof(arr) / sizeof(*arr);

    std::sort(arr, arr + n);

    bool hasDuplicates = std::unique(arr, arr + n) != arr + n;

    if (hasDuplicates) {

        std::cout << “Array contains duplicates”;

    } else {

        std::cout << “Array contains no duplicates”;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Array contains duplicates

 
С C++11 мы можем получить итератор в начало и конец массива:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <iostream>

#include <algorithm>

#include <iterator>

int main()

{

    int arr[] = {1, 3, 5, 7, 3, 9};

    std::size_т n = std::distance(std::begin(arr), std::end(arr));

    std::sort(std::begin(arr), std::end(arr));

    bool hasDuplicates = std::unique(std::begin(arr), std::end(arr)) != std::end(arr);

    if (hasDuplicates) {

        std::cout << “Array contains duplicates”;

    } else {

        std::cout << “Array contains no duplicates”;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Array contains duplicates

Это все о проверке дубликатов в массиве на C++.

Как найти пересечение между двумя массивами JavaScript?

У нас есть два массива с уникальными наборами чисел:

let arr1 = [1,2,3,4,5,6];
let arr2 = [4,5,6,7,8,9];

В каждом массиве число встречается ровно 1 раз.

Мы хотим получить такие числа, которые есть и в первом массиве и во втором. Как это сделать?

Получение массива повторяющихся чисел из двух массивов при помощи двух циклов FOR OF в JavaScript

Мы можем написать свою функцию, которая будет принимать два параметра — два массива.

function intersect(a, b){
  let new_arr = [];
  for(element_a of a){
    for(element_b of b){
    if(element_b == element_a){new_arr.push(element_a)}}
  }
  return new_arr;
};

Цикл FOR OF обегает значения в свойствах объектов. В нашем случаем массивы — это объекты класса Array по стандарту ECMAScript. Именно в этой функции нас не интересует цикл FOR или FOR IN.

Мы назвали нашу функцию именем «intersect» по аналогии с названием оператора в языке SQL.

Пример работы функции по нахождению повторяющихся чисел в двух массивах

Вызываем нашу функцию:

intersect(arr1, arr2)

Результат работы функции по массивам из чисел:

Нашли одинаковые числа, которые есть в обоих массивах JavaScript

Нашли одинаковые числа, которые есть в обоих массивах JavaScript

Результатом вызова нашей функции стал массив из чисел (класс Number). Каждый элемент нового массива присутствует как в первом массиве, так и во втором.

Данная функция также хорошо будет работать и с массивами из строк.

let arr3 = ['1','2','3','4','5','6'];
let arr4 = ['4','5','6','7','8','9'];

В каждом массиве строка встречается ровно 1 раз.

Вызываем нашу функцию:

intersect(arr3, arr4)

Результат работы функции по массивам из строк:

Нашли одинаковые строки, которые есть в обоих массивах JavaScript

Нашли одинаковые строки, которые есть в обоих массивах JavaScript

Информационные ссылки

Официальная страница стандарта ECMAScript — https://tc39.es/ecma262/multipage/ — https://tc39.es/ecma262/

Объекты Array — https://tc39.es/ecma262/#sec-array-objects

Цикл FOR OF — https://tc39.es/ecma262/#sec-for-in-and-for-of-statements

Отсечение строки по символу косой черты - JavaScript

  У нас есть строка: var stroka = «honda/хонда» Мы хотим отсечь лишнюю часть, которая начинается после знака косой черты — «/«. […]

Проверили наличие ключей в объекте - JavaScript

Как проверить существует ли у свойства объекта искомый ключ? Есть объект: var obiekt = { a:»aa», b:»bb», c:»cc» } Мы попробуем узнать […]

22 элемента с классом c-product-tile-picture__holder - JavaScript

Решение для нахождения родителей нескольких элементов Потестируем на примере интернет-магазина.   Для эксперимента возьмём класс «c-product-tile-picture__holder». Для начала нужно отобрать все элементы […]

Возведение в квадрат - JavaScript

  Способ № 1 Мы можем использовать оператор двойной звёздочки ** — это «экспоненциальный оператор» (Exponentiation Operator) — оператор возведения в степень. […]

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