Как получить несопоставленный результат из списка / массива - PullRequest
0 голосов
/ 05 июля 2019

Я хотел бы сравнить объекты двух массивов и получить новый массив с несоответствующими объектами.Это: Array1 Array2 оба содержат Object User с методами getId и getUsername

    for (int fw = 0; fw < tempOldArray.size(); fw++) {
        for (int fi = 0; fi < tempArray.size(); fi++) {
            if (tempOldArray.get(fw).getId() == tempArray.get(fi).getId()) {
                match++;
                break;
            }
            if(fi == (tempArray.size()-1)) {
                nomatchfound++;
                break;
            }
        }
    }

    Array1: {[1231, Peter], [2562, Jackson], [38987, Robert], [4765, William]}
    Array2: {[2562, Jackson], [7584, Alfred], [38987, Robert], [8123, Mozart]}

    Array3 should output {[1231, Peter], [4765, William]} 
and Array4 should output {[7584, Alfred], [8123, Mozart]}

Также задан вопрос о том, как извлечь результат из списка

{"peter", "trump", "donald", "jerry"}
{"peter", "donald", "lucas", "jerry"}

и вывести несоответствующие единицы

Ответы [ 5 ]

1 голос
/ 05 июля 2019

Вы можете использовать что-то вроде этого. С помощью этой функции не имеет значения, если вы сравниваете collection1 с collection2 или collection2 с collection1, если они имеют разные размеры. Разность всегда должна быть равна.

private static <E> List<E> getDiff(Collection<E> collection1, Collection<E> collection2) {
    Collection<E> largerOne = collection1.size() >= collection2.size() ? collection1 : collection2;
    Collection<E> smallerOne = largerOne == collection1 ? collection2 : collection1;
    return largerOne.stream().filter(i -> !smallerOne.contains(i)).collect(Collectors.toList());
}
1 голос
/ 05 июля 2019

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

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }

    if (!Person.class.isAssignableFrom(obj.getClass())) {
        return false;
    }

    final Person other = (Person) obj;

    if (this.id != other.id) {
        return false;
    }

    return true;
}

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

list1.removeAll(list2);
1 голос
/ 05 июля 2019

Это просто вопрос дискретной математики.Проверьте реализацию removeAll():

public static void main(String[] args) {
    List<String> first = Arrays.asList("peter", "trump", "donald", "jerry");
    List<String> second = Arrays.asList("peter", "donald", "lucas", "jerry");

    List<String> results = new ArrayList<>(first);
    results.removeAll(second);

    System.out.println(results.toString());
}

Отпечатки:

[trump]

Это удовлетворяет вашему требованию для выхода из first и second Списки не повреждены и создается 3-й список, содержащий результат.

1 голос
/ 05 июля 2019

Остальные ответы, показывающие List::removeAll, такие как тот из Cuga , являются правильными и лучше всего подходят для простого случая.

Java-потоки

Я покажу причудливый подход с использованием потоков Java.Вы можете использовать этот подход, если ваша ситуация усложняется.

Определите два списка.Использование List.of для создания неизменяемого списка было добавлено в Java 9.

List < String > namesA = List.of ( "Peter" , "Paul" , "Mary" , "Wendy" , "Lisa" );
List < String > namesB = List.of ( "Peter" , "Paul" , "Jesse" , "Wendy" , "Lisa" );

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

  • Чтобы найти все подходящие предметы, используйте.filter ( namesB :: contains ).
  • Чтобы найти все элементы, которые не соответствуют (отдельные элементы), используйте:.filter ( Predicate.not ( namesB :: contains ) )

Этот трюк Predicate.not является новым для Java 11, как показано здесь .

Соберите результаты в новый List.

List < String > distinct =
        namesA.stream ()
                .filter ( Predicate.not ( namesB :: contains ) )
                .collect ( Collectors.toList () );

Дамп на консоль.

System.out.println ( "namesA: " + namesA );
System.out.println ( "namesB: " + namesB );
System.out.println ( "distinct: " + distinct );

Results.

namesA: [Питер, Пол, Мэри, Венди, Лиза]

namesB: [Питер, Павел, Джесси, Венди, Лиза]

различаются: [Мэри]

1 голос
/ 05 июля 2019

Если вы уже используете списки, просто используйте что-то в строках

list1.removeAll (list2)

Для дальнейшей оптимизации, если вы используете хэш-сет, ваши операции удаления становятся O (1), так что это еще более эффективно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...