Сравните два списка и выведите отсутствующий и дополнительный элемент в Java - PullRequest
1 голос
/ 09 апреля 2020

У меня есть два списка строк. Список A и B. Списки могут иметь одинаковую длину или, возможно, один длиннее другого. В каждом списке нет повторяющихся значений. Они состоят из случайных чисел.

Что я нужно найти отсутствующий элемент, и в A есть дополнительный элемент по сравнению со списком B. И сохранить их в двух новых списках, один для отсутствующих элементов и один для дополнительных элементов.

Например:

A = ["3000047" , "3000042" , "3000030"  , "30000475"]

B = ["3000047" , "3000043" , "3000030" ]

Выходные данные должны быть

Missing = ["3000043"]

Extra = ["3000042" , "30000475"]

Я думаю сделать так, как показано ниже. Но не уверен насчет производительности и ее эффективности.

  1. Чтение элемента из A.
  2. Проверьте, существует ли элемент в B.
  3. Если нет, добавьте его в список Extra. .
  4. Если да, удалить элемент из A и B.
  5. Если B пусто, добавить все элементы переименования в список Extra.
  6. Если A пусто, добавить все элементы переименования. в пропущенном списке.

1 Ответ

3 голосов
/ 09 апреля 2020

Но не уверен насчет производительности и ее эффективности

В отношении производительности используйте Set (реализация HashSet) вместо List. Это даст лучшую O сложность времени по адресу:

Проверьте, существует ли элемент в B.

Это когда вы примените метод contains. Проверьте этот ответ для подробностей об этом.

Содержит для HashSet значение O(1) по сравнению с O(n) для списка, поэтому вы никогда не должны использовать список, если вам часто нужно запустить contains.


Алгоритм, который вы предложили, может быть реализован с использованием Java встроенных функций.

Set#removeAll

Set<String> A = new HashSet<>(Arrays.asList("3000047", "3000042", "3000030", "30000475"));
Set<String> B = new HashSet<>(Arrays.asList("3000047", "3000043", "3000030"));

Set<String> copyA = new HashSet<>(A);
Set<String> copyB = new HashSet<>(B);

copyB.removeAll(A);
System.out.println("Missing: " + copyB);

copyA.removeAll(B);
System.out.println("Extra: " + copyA);

Выход

Missing: [3000043]
Extra: [3000042, 30000475]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...