Как сравнить два массива, содержащие объекты с общими свойствами.
Пример: у меня есть класс 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 можно игнорировать.
@BenjaminUrquhart Да, правильно, мне нужны номера строк из списка1, если они совпадают в списке2. Меня не волнует номер строки List2.




Если в этом случае у вас есть два разных списка и вы хотите провести сравнение, одним из простых способов сделать это может быть два цикла foreach с условием равенства, а затем со значением:
for(Abc list1Obj : list1)
{
for(Abc list2Obj : list2)
{
if (list1.dataString.Equals(list2.dataString))
{
int value = Integer.parseInt(list1.rowNumber);
}
}
}
В этом случае это будет для каждого элемента в списке1 с каждым элементом в списке2.
Это вопрос Java, а не С#. :)
Плохо, для конвертации я помню, что мне нужно изменить, но я думаю, что в этом контексте правильно. Разве это не так?
В Java имена методов начинаются со строчной буквы. Должно быть equals.
В терминах высокого уровня ваш код должен:
Чтобы сделать код быстрым, на втором этапе набор строк данных 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 можно игнорировать.
Я новичок в концепции Streams. Я использую джаву 8
Я попытался вернуть list1.stream().filter(x -> !dataStrings.contains(x.getDataString())).map(x -> x.getRowNum()).collect(Collectors.toList()); и это сработало
Я хочу добавить +1 к каждому rowNum из возвращаемого списка. Как я могу сделать это в потоках.
Чтобы узнать больше о потоках Java, прочитайте официальную документацию, выполнив поиск «Java streams site:oracle.com» и дополнительные сведения. Все, что написано Baeldung, также заслуживает доверия.
Итак, вы хотите, чтобы
rowNumsвсех объектов в list1 и list2 имели одинаковыеdataString?