Как сравнить два массива, содержащие объекты с общими свойствами

Как сравнить два массива, содержащие объекты с общими свойствами.

Пример: у меня есть класс pojo Abc

Class Abc {
String dataString ;
int rowNum;
......
}

Abc list1 contains - 2000 records & more sometimes
Abc list2 contains - 60 records & more sometimes

Я хочу сравнить list1 dataString со строкой данных list2 и вернуть rownum если list1.dataString Примечание равно list2.dataString

Мне нужно rowNumber из List1, если строка данных НЕ совпадает. List2 Rownum можно игнорировать.

Итак, вы хотите, чтобы rowNums всех объектов в list1 и list2 имели одинаковые dataString?

Benjamin Urquhart 15.05.2019 03:47

@BenjaminUrquhart Да, правильно, мне нужны номера строк из списка1, если они совпадают в списке2. Меня не волнует номер строки List2.

Karuna 15.05.2019 03:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если в этом случае у вас есть два разных списка и вы хотите провести сравнение, одним из простых способов сделать это может быть два цикла foreach с условием равенства, а затем со значением:

for(Abc list1Obj : list1)
{
      for(Abc list2Obj : list2)
      {
          if (list1.dataString.Equals(list2.dataString))
          {
              int value = Integer.parseInt(list1.rowNumber);
          }
      }
}

В этом случае это будет для каждого элемента в списке1 с каждым элементом в списке2.

Это вопрос Java, а не С#. :)

Roland Illig 15.05.2019 05:19

Плохо, для конвертации я помню, что мне нужно изменить, но я думаю, что в этом контексте правильно. Разве это не так?

r_batra 15.05.2019 14:49

В Java имена методов начинаются со строчной буквы. Должно быть equals.

Roland Illig 15.05.2019 17:15
Ответ принят как подходящий

В терминах высокого уровня ваш код должен:

  • перебрать список1
  • для каждого элемента проверьте, появляется ли его строка данных где-нибудь в списке2
  • если да, включите номер строки элемента list1 в результат

Чтобы сделать код быстрым, на втором этапе набор строк данных list2 может быть предварительно вычислен. По-прежнему в терминах высокого уровня код выглядит так:

List<int> filtered(List<Abc> list1, List<Abc> list2) {
    var dataStrings = setOf(list2.map(x -> x.dataString));

    var abcs = list1.filter(x -> dataStrings.contains(x.dataString));

    return abcs.map(x -> x.rowNum);
}

В стандартной Java код, конечно, выглядит более раздутым:

List<int> filtered(List<Abc> list1, List<Abc> list2) {
    Set<String> dataStrings = list2.stream()
        .map(x -> x.dataString))
        .collect(Collectors.toSet());

    return list1.stream()
        .filter(x -> dataStrings.contains(x.dataString))
        .map(x -> x.rowNum)
        .collect(Collectors.toList());
}

Приведенное выше решение работает для моего первоначального запроса. Небольшое исправление по моему первоначальному вопросу. Я хочу вернуть rowNum, который не соответствует dataString b/w list1 и list2. Номер строки List2 можно игнорировать.

Karuna 15.05.2019 22:59

Я новичок в концепции Streams. Я использую джаву 8

Karuna 15.05.2019 23:22

Я попытался вернуть list1.stream().filter(x -> !dataStrings.contains(x.getDataString())).map(x -> x.getRowNum()).collect(Collectors.toList()); и это сработало

Karuna 16.05.2019 01:30

Я хочу добавить +1 к каждому rowNum из возвращаемого списка. Как я могу сделать это в потоках.

Karuna 16.05.2019 01:31

Чтобы узнать больше о потоках Java, прочитайте официальную документацию, выполнив поиск «Java streams site:oracle.com» и дополнительные сведения. Все, что написано Baeldung, также заслуживает доверия.

Roland Illig 16.05.2019 03:12

Другие вопросы по теме