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

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

04.01.2019, 10:14. Показов 13132. Ответов 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
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
05.01.2019, 15:33
Студворк — интернет-сервис помощи студентам
С использованием Stream-API:

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
import java.util.*;
import java.util.stream.*;
import java.lang.*;
import java.io.*;
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static int [] diff(int [] ar1, int [] ar2)
    {
        int n=ar2.length;
        int start=ar2[0], fin=ar2[n-1]; // границы фильтрации (второй массив сам по себе и не нужен!)
        IntStream st_ar1 = Arrays.stream(ar1);
        return st_ar1.filter(x -> x<start || x > fin).toArray();
              
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        int [] ar1={1,2,3,4,5,6,7,23,24};
        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/Kd6Vyy

Добавлено через 10 минут
Цитата Сообщение от ViktorFX Посмотреть сообщение
Как и мой
- а почему он так странно назван? Indexs - индексы? И - главное - зачем Вы каждый элемент первого массива сравниваете с каждым - второго? Ведь оба массива отсортированы. А это значит, что произвольный элемент первого массива "годится" в одном из двух случаев:

- он меньше первого эл-та a2
- он больше последнего эл-та a2

Второй цикл не нужен! Я уже не говорю о том, что Вы взяли под массив Indexs лишнюю память. Если возвращать весь массив, то у пользователя Вашего кода возникнет вопрос: где кончается область реальных элементов?
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
05.01.2019, 15:58
Цитата Сообщение от 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.util.Arrays;
import java.util.stream.IntStream;
 
 /*
     Поиск в одном массиве элементов, которых нет в другом массиве 
*/
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("_____MyStream__________");
        IntStream.range(0,ar1.length)
                .filter(i -> IntStream.range(0,ar2.length).filter(j -> (ar1[i] == ar2[j])).count() == 0)
                .forEach(i -> System.out.println("ar1["+i+"]="+ar1[i]));
        System.out.println("_____getUnique__________");
        System.out.println(Arrays.toString(getUnique(ar1,ar2)));
        System.out.println("_____diff__________");
        System.out.println(Arrays.toString(diff(ar1,ar2)));
        System.out.println("_____diffStream__________");
        System.out.println(Arrays.toString(diffStream(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] && j > 0) break; 
                if(a1[i] == a2[j]) {
                    isUnique = false; break;
                }
                isUnique = true;
            }
            if(isUnique) {
                indexs[count] = a1[i];
                count++;
            }
        }
        return indexs;
    }
    // from cyber
    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;
    }
    // from cyber again
    public static int [] diffStream(int [] ar1, int [] ar2){
        int n=ar2.length;
        int start=ar2[0], fin=ar2[n-1]; // границы фильтрации (второй массив сам по себе и не нужен!)
        IntStream st_ar1 = Arrays.stream(ar1);
        return st_ar1.filter(x -> x<start || x > fin).toArray();
    }
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
_____MyStream__________
ar1[0]=1
ar1[2]=3
ar1[4]=5
ar1[6]=7
ar1[8]=9
_____getUnique__________
[1, 3, 5, 7, 9, 0, 0, 0, 0, 0]
_____diff__________
[1]
_____diffStream__________
[1]
Кстати, мой getUnique() тоже "лажевый", но при более редких случаях, но я его не исправлял т.к. он пока лучше diff-ов.
А вот мой стрим вроде нормальный.

Добавлено через 7 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Вы взяли под массив Indexs лишнюю память.
Это потому что я не знаю наперед сколько там будет уникальных символов, а вы предполагаете что значения второго массива непрерывны, и не смотрите на все что между его минимумом и максимумом. Потому вы и не "перебираете" такие возможности и "знаете" наперед размер результирующего массива. А как показывает практика это приводит вас к ошибкам.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
05.01.2019, 16:23
Java
1
int[]res = Arrays.stream(ar1).filter(x->!Arrays.stream(ar2).boxed().collect(Collectors.toList()).contains(x)).toArray();
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38168 / 21103 / 4307
Регистрация: 12.02.2012
Сообщений: 34,692
Записей в блоге: 14
05.01.2019, 16:58
ViktorFX, да, признаю. Ваша правда, а я позорно ощибся...

Тогда чуть сложнее.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
    public static int [] diff(int [] ar1, int [] ar2)
    {
        int n1=ar1.length,n2=ar2.length;
        int [] res;
        int i,k,a,b,c;
        int min=ar2[0],max=ar2[n2-1];
        boolean flg;
        
        int [] tmp=new int [n1];
        
        k=0;
        for (i=0; i<n1; i++)
        {
            if ((ar1[i] < min) || (ar1[i] > max))
            {
               tmp[k++]=ar1[i];
            }
            else
            {
                      // Двоичный поиск гораздо быстрее прямого перебора!
                a=0; 
                b=n2-1;
                if (ar2[a]==ar1[i] || ar2[b]==ar1[i]) 
                   flg=true;
                else
                {
                  flg=false;
                  while(b-a>1)
                  {
                    c=(a+b)/2;
                    if (ar2[c]==ar1[i]) 
                    {
                        flg=true;
                        break;
                    }
                    if (ar2[c] > ar1[i])
                    {
                        b=c;
                    }
                    else
                    {
                        a=c;
                    }
                  }
                }  
                if (! flg) tmp[k++]=ar1[i];
            }
        }
        
        res=new int[k];
        
        for (i=0; i<k; i++)
        {
            res[i]=tmp[i];
        }
        return res;
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        int [] ar1={1,2,3,4,5,6,7,10,15};
        int [] ar2={1,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/SuMwco

Добавлено через 1 минуту
iSmokeJC, Ваш код очень лаконичен, но учитывает ли он тот факт, что массивы отсортированы?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
05.01.2019, 17:14
Catstail,
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
05.01.2019, 17:26
Цитата Сообщение от Catstail Посмотреть сообщение
учитывает ли он тот факт, что массивы отсортированы
Вообще без разницы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2019, 17:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка 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 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru