Найти несовпадающие элементы массива

131
13 февраля 2021, 13:50

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

String[] first_arr = {"Den", "Michel", "Dana", "Sophie", "Clar"};
String[] sec_arr = {"Michel", "Sophie", "Clar"};
String[] res_arr = new String[first_arr.length];
int count = 0;
for (int i = 0; i < first_arr.length; i++) {
    for (int j = 0; i < sec_arr.length; i++) {
        if (first_arr[i].equals(sec_arr[i])) {
            res_arr[count++] = first_arr[i];
        }
    }
}
Answer 1

Например, так (подразумевая, что в каждом из массивов нет дубликатов, иначе придётся чуть модифицировать)

Завести хэш-таблицу с парами (ключ - значение из массива; значение - логическое или счётчик)

Добавить все элементы в таблицу. Если элемент уже есть - сделать значение false, если нет - true

Вывести ключи со значением true.

Или так:

Отсортировать оба массива

Выполнить процедуру, аналогичную слиянию в mergesort, только при каждом изменении индексов запоминать кандидатов на вывод, и выводить их, если не нашлось пары

Answer 2

Не совсем понял условие, поэтому 2 варианта: удаляем все дублирующие, оставляем только те, которые не дублируются:

public class Main {
    public static void main(String[] args) throws IOException {
        String[] first_arr = {"Den", "Michel", "Dana", "Sophie", "Clar"};
        String[] sec_arr = {"Michel", "Sophie", "Clar" };
        /*************************************************************/
        String [] res_arr = Stream.of(first_arr, sec_arr)
                .flatMap(arr->Arrays.stream(arr))
                .distinct()
                .toArray(String[]::new);
        System.out.println(Arrays.toString(res_arr));
        /*************************************************************/
        String [] res_arr1 = Arrays.stream(first_arr)
                .filter(arr->!Arrays.stream(sec_arr).anyMatch(arr::equals)) 
                .toArray(String[]::new);
        System.out.println(Arrays.toString(res_arr1));
    }
}
Answer 3

Получаем массив несовпадающих элементов из двух массивов:

String[] arr1 = {"Den", "Michel", "Dana", "Sophie", "Clar", "Dana"};
String[] arr2 = {"Michel", "Sophie", "Clar"};
String[] arr3 = Stream.of(arr1, arr2)
        .flatMap(arr -> Arrays.stream(arr).distinct())
        .collect(Collectors.groupingBy(e -> e, Collectors.counting()))
        .entrySet().stream()
        .filter(e -> e.getValue() == 1)
        .map(Map.Entry::getKey)
        .toArray(String[]::new);
System.out.println(Arrays.toString(arr3)); // [Dana, Den]
Answer 4

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

Итоговый код такой:

    String[] first_arr = {"Den", "Michel", "Dana", "Sophie", "Clar"};
    String[] sec_arr = {"Michel", "Sophie", "Clar"};
  
    HashSet<String> hashSet=new HashSet();
    for (String arr: first_arr) 
      hashSet.add(arr);
    for (String arr: sec_arr)
      hashSet.add(arr);
    String[] res_arr = hashSet.toArray(new String[0]);  
    System.out.println(Arrays.toString(res_arr));
Answer 5
for (int i = 0; i< sec_arr.length(); i++){
for(int y = 0; y< first_arr.length(); y++){
      If (sec_arr[i].equals(first_arr[y])
          sec_arr[i] = " ";
          first_arr[y]  = " ";
  }
}

Потом соеденяем два массива в строку, убираем лишние пробелы и делаем split() по пробелам и добавляем в новый массив стрингов. Както так. Это универсальный способ, но у тебя все проще, не нужно соеденять два массива в одну строку. Достаточно просто к большему массиву применить toString(). А дальше так же как я писал выше.

READ ALSO
Java Servlet textarea

Java Servlet textarea

я только начал изучать servlet'ы, и в интернете куча примеров с созданием Hello servletНо как создать более сложные не обьясняется

95
Запись в файл из списка

Запись в файл из списка

1я заполнил список элементами из файла "test1

135
Падает приложение Android. ANR

Падает приложение Android. ANR

Я пишу приложение на Android с помощью XamarinВ приложении есть сервис, работающий в фоне и обращающийся к api

99
Скачивание веб страницы.. Java

Скачивание веб страницы.. Java

Доброго времени суток всем! Есть такое задание, вот оно:

100