Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/64: Рейтинг темы: голосов - 64, средняя оценка - 4.59
 Аватар для AleKr
0 / 0 / 0
Регистрация: 01.01.2018
Сообщений: 21

Поиск в одном массиве элементов, которых нет в другом массиве

04.01.2019, 10:14. Показов 13128. Ответов 25
Метки нет (Все метки)

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

Даны 2 отсортированных массива.
Найти все элементы в 1-м массиве, которых нет во 2-м.
Пример:
Массив 1- [1, 2, 3, 4], Массив 2- [2, 4, 6, 8]
Ответ- 1, 3

Вот таким образом начал решение задачи, но сравнивает все элементы массивов не посредственно друг с другом:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int[] array1 = {1, 2, 3, 4}; 
int[] array2 = {2, 4, 6, 8}; 
 
for (int i=0; i < array1.length; i++) { 
 
for(int j=0; j < array2.length; j++) { 
System.out.print("i =" + array1[i] + " j =" + array2[j] + "; "); 
 
if (array1[i] != array2[j]) { System.out.print("*_"+array1[i]+"_*; "); } 
 
} System.out.println(); 
} 
} 
}
ответ —>
i =1 j =2; *_1_*; i =1 j =4; *_1_*; i =1 j =6; *_1_*; i =1 j =8; *_1_*;
i =2 j =2; i =2 j =4; *_2_*; i =2 j =6; *_2_*; i =2 j =8; *_2_*;
i =3 j =2; *_3_*; i =3 j =4; *_3_*; i =3 j =6; *_3_*; i =3 j =8; *_3_*;
i =4 j =2; *_4_*; i =4 j =4; i =4 j =6; *_4_*; i =4 j =8; *_4_*;

Может кто нибудь подсказать как его доработать
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2019, 10:14
Ответы с готовыми решениями:

В одном методе список доступен, в другом - нет
Почему в одном методе list доступен, а другом - нет? import java.util.Arrays; import java.util.ArrayList; import...

Поиск повторяющихся элементов в массиве
Необходимо посчитать количество строк, не содержащих повторяющиеся элементы массива. Не понимаю в чем ошибка, неверно считает строки....

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

25
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
04.01.2019, 10:40
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
        int[] array1 = {1, 2, 3, 4};
        int[] array2 = {2, 4, 6, 8};
 
        for (int elem:array1){
            if (!isPresent(array2, elem)) System.out.print(elem + "\t");
        }
    }
 
    private static boolean isPresent(int[] arr, int val) {
        for (int elem : arr) {
            if (elem == val) return true;
        }
        return false;
    }
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
04.01.2019, 10:43
про методы почитай и код отформатировать нормально

Добавлено через 1 минуту
iSmokeJC, т.к массивы отсортированы, не надо перебирать все элементы
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
04.01.2019, 10:45
xoraxax, согласен, я просто набросал общий случай, для понимания ТСу.
0
 Аватар для AleKr
0 / 0 / 0
Регистрация: 01.01.2018
Сообщений: 21
04.01.2019, 11:09  [ТС]
Спасибо большое, у меня и мысли не было решать через другой метод

Добавлено через 4 минуты
не совсем понятно, а как без перебора элементов определить равны элементы или нет???
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
04.01.2019, 11:39
Цитата Сообщение от AleKr Посмотреть сообщение
не совсем понятно
Не совсем понятен вопрос.
Можно сконвертить массив в лист и проверить методом contains()
1
 Аватар для AleKr
0 / 0 / 0
Регистрация: 01.01.2018
Сообщений: 21
04.01.2019, 14:42  [ТС]
.. думал как то обойтись циклами определёнными, это имел ввиду, но ни как не получалось
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
04.01.2019, 21:34
Java
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
27
28
29
30
31
32
33
import java.util.*;
import java.lang.*;
import java.io.*;
 
class Ideone
{
    public static int [] diff(int [] ar1, int [] ar2)
    {
        int n=ar1.length;
        int [] res;
        int i,k=0;
        i=ar2.length;
        int min=ar2[0],max=ar2[i-1];
        for (i=0; i<n; i++)
        {
            if ((ar1[i] < min) || (ar1[i] > max)) k++;
        }
        res=new int[k];
        k=0;
        for (i=0; i<n; i++)
        {
            if ((ar1[i] < min) || (ar1[i] > max)) res[k++]=ar1[i];
        }
        return res;
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        int [] ar1={1,2,3,4,5,6,7};
        int [] ar2={7,8,9,10,11};
        int [] r=diff(ar1,ar2);
        for(int i=0; i<r.length; i++) System.out.print(r[i]+" ");
    }
}
https://ideone.com/VDqO8x
0
04.01.2019, 21:57

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
int i,k=0;
* * * * i=ar2.length;
* * * * int min=ar2[0],max=ar2[i-1]
чот заковыристо, можно и заинлайнить. И вообще лучше объявлять переменные не в начале чего-то, а там, где они используются.

0
04.01.2019, 22:10

Не по теме:

Цитата Сообщение от xoraxax Посмотреть сообщение
И вообще лучше объявлять переменные не в начале чего-то, а там, где они используются.
- нужно добавлять - "с моей точки зрения".

0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
04.01.2019, 23:15
Catstail,
Цитата Сообщение от Catstail Посмотреть сообщение
нужно добавлять - "с моей точки зрения".
с точки зрения здравого смысла и читаемости. За подобный код обычно практикантов по рукам бью.

Добавлено через 58 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
public static List<Integer> diff_sorted(int[] ar1, int[] ar2) {
        List<Integer> res = new ArrayList<>();
        for (int i = 0, j = 0; i < ar1.length; i++) {
            while (j < ar2.length - 1 && ar1[i] > ar2[j]) {
                j++;
            }
            if (ar1[i] != ar2[j]) {
                res.add(ar1[i]);
            }
        }
        return res;
    }
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
04.01.2019, 23:19
Пока тема жива..
Java
1
2
3
4
5
6
7
8
9
10
public class HasOneUnique{
 
    public static void main(String[] args){
        int[] a1 = {1, 2, 3, 4}; 
        int[] a2 = {2, 4, 6, 8}; 
        IntStream.range(0,a1.length)
                .filter(i -> IntStream.range(0,a2.length).filter(j -> (a1[i] == a2[j])).count() == 0)
                .forEach(i -> System.out.println("a1["+i+"]="+a1[i]));
    }
}
Code
1
2
a1[0]=1
a1[2]=3
Я хотел было воспользовать еще тем что массивы сортированные, но вставлять фильтр filter(j -> a1[i] < a2[j]) чтобы после того как перевалит не проверять, не стал. Думаю сравнения достаточно
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
05.01.2019, 10:18
Цитата Сообщение от xoraxax Посмотреть сообщение
За подобный код обычно практикантов по рукам бью.
- упёртых доктринёров я обычно ем с кашей на завтрак.
ViktorFX, конечно, здесь функциональный интерфейс очень уместен. Но моё решение основано на элементарных конструкциях. Которые должен знать каждый.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
05.01.2019, 11:38
Catstail, Если честно, то мне сложно читать ваш код. У меня просто другая логика(представление) какой путь напрямую.
Java
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
27
public class HasOneUnique{
 
    public static void main(String[] args){
        int[] ar1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int[] ar2 = {2, 4, 6, 8, 10, 12, 14, 16};
        System.out.println(Arrays.toString(getUnique(ar1,ar2)));
    }
    public static int[] getUnique(int[] a1, int[] a2) {
        boolean isUnique = false;
        int count = 0;
        int[] indexs = new int[a1.length];
        for(int i=0; i<a1.length; i++) {
            for(int j=0; j<a2.length; j++) {
                if(a1[i] < a2[j]) break;
                if(a1[i] == a2[j]) {
                    isUnique = false; break;
                }
                isUnique = true;
            }
            if(isUnique) {
                indexs[count] = a1[i];
                count++;
            }
        }
        return indexs;
    }
}
Добавлено через 22 минуты
Там усливие надо подправить
Java
1
if(a1[i] < a2[j] && j > 0) break;
0
 Аватар для Aviz__
2739 / 2048 / 507
Регистрация: 17.02.2014
Сообщений: 9,467
05.01.2019, 13:01

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
упёртых доктринёров я обычно ем с кашей на завтрак
Не, форум значительно обеднеет, если его в кашу)). Да и жесткий он не по годам...


Моя полушка:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
        int[] a1 = {1, 2, 3, 4};
        int[] a2 = {2, 4, 6, 8};
        IntStream.of(a1)
                .filter(ea1 ->
                {boolean ret = true;
                    for (int tmp : a2)
                        if (tmp == ea1){
                            ret = false;
                            break;
                        }
                    return ret;
                })
                .forEach(System.out::println);
    }
1
 Аватар для Kukstyler
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
05.01.2019, 13:18
Можно на таком принципе:

Java
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
public class Start { 
    public static void main(String [] args) {
        int[] array1 = {1, 2, 3, 4}; 
        int[] array2 = {2, 4, 6, 8}; 
                
        int i = 0;
        int j = 0;
        
        while (i < array1.length){
            if (array1[i] == array2[j]) {
                i++;
                j++;
            }
            else{
                if (array1[i] < array2[j]) {
                    System.out.println(array1[i]);
                    i++;
                }
                else {
                    j++;
                }
            }
        }
    }   
}
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
05.01.2019, 14:17
Цитата Сообщение от ViktorFX Посмотреть сообщение
мне сложно читать ваш код.
- а это - оценочное, субъективное мнение. Код прозрачен.

Добавлено через 2 минуты
ViktorFX,
Но если взглянуть на Ваш код внимательнее, то заметим два вложенных цикла... Что в худшем случае порождает производительность O(n2). Тогда как у меня - O(n).

Добавлено через 1 минуту
К тому же мой код возвращает просто массив, содержащий только нужные данные. А Ваш - возвращает индексы и расходует лишнюю память...
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
05.01.2019, 14:54
Цитата Сообщение от Catstail Посмотреть сообщение
- а это - оценочное, субъективное мнение. Код прозрачен.
Видимо не для меня((
Еще я теперь хотел было разобратся и запустить его, так он некорректно работает ((
Java
1
2
3
int[] ar1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] ar2 = {2, 4, 6, 8, 10, 12, 14, 16};
System.out.println(Arrays.toString(diff(ar1,ar2)));
Вывод : [1]

порождает производительность, возвращает индексы и расходует лишнюю память
Мой метод, как и ваш, возвращает еще один (лишний?) массив, что одинаково нехорошо.
Лучше конечно по производительности мой пример со стримами, да и читается легче и понятнее, но чтобы его написать тут да приходится больше трудится. (более ассиметричен в сложности "чтении-написании" чем по старому). ИМХО конечно.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
05.01.2019, 14:57
Цитата Сообщение от ViktorFX Посмотреть сообщение
Мой метод, как и ваш, возвращает еще один (лишний?) массив, что одинаково нехорошо.
- мой метод берет на вход два массива и строит из них массив, содержащий нужные данные. Это вполне разумный подход.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
05.01.2019, 14:59
Цитата Сообщение от Catstail Посмотреть сообщение
мой метод берет на вход два массива и строит из них массив, содержащий нужные данные.
Как и мой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2019, 14:59
Помогаю со студенческими работами здесь

Определить количество элементов в массиве, значения которых больше первого элемента
Задан массив, состоящий из 15 элементов вещественного типа. Определить количество элементов, значения которых больше первого элемента. ...

Найти сумму тех элементов массива которых нет в другом массиве
Задано два одномерных массива {bi} и {di}(i=1,2,...,n). Найти сумму тех элементов массива {bi} которых нету в массиве {di}.

Вычесть два массива, если в одном массиве больше элементов, чем в другом
Здраствуйте! Сижу изучаю одномерные массивы, но зашел в тупик на счет вычитания массивов... Для вас это конечно просто, но я чего-то не...

Найти в массиве X наименьший элемент среди тех, которых нет в массиве Y
Доброго времени суток с; Заданы целочисленные массивы X(n) и Y(m), каждый из которых содержит неповторяющиеся элементы. Найти в...

Оставить в первом массиве только те элементы, которых нет во втором массиве
Даны 2 массива вещественных чисел A, B. Оставить в первом массиве только те элементы, которых нет во втором массиве. Заранее спасибо,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru