Проверка общего элемента между двумя похожими списками с использованием потоков

Скажем, у меня есть 2 похожих списка (хотя и не одинаковых). Например: один список целых чисел и другой список шестнадцатеричных строк (который может быть сопоставлен с целым числом), как я могу найти, есть ли какой-либо общий элемент с одинаковым индексом в обоих списках с использованием потоков?

Рассмотрим следующий код:

List<Integer> l1 = List.of(11, 12, 13, 14, 15);
List<String> l2 = List.of("F", "E", "D", "C", "B")

boolean isCommon = checkIfCommonElementExists(l1, l2);
System.out.print("There's at least one common element at same index: " + isCommon);

В этом примере третий элемент обоих списков одинаков, т.е. 13 или OxD

Как я могу проверить (или найти), есть ли какой-либо такой общий элемент с тем же индексом и разорвать при первом совпадении (что-то вроде anyMatch()) с помощью Streams? Это простая проблема, которую можно решить без потоков, но можно ли ее решить с помощью потоков?

Это хороший пример того, что не следует делать с помощью Streams.

VGR 05.05.2022 14:28

Если вы хотите отслеживать индексы, вероятно, проще и эффективнее использовать традиционные циклы for.

Zircon 05.05.2022 14:28

Это строгое требование делать это с потоками? Это было бы намного проще сделать с помощью простого цикла, поскольку цикл по своей конструкции знает об индексе списков, а поток (обязательно) не знает об этом.

th0bse 05.05.2022 14:47

Это не строгое требование. Я легко смог это сделать с помощью цикла, но когда я столкнулся с этой проблемой, мне просто было любопытно узнать, можно ли ее решить с помощью потоков. И, как предлагает приведенное ниже решение, это действительно возможно.

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

Ответы 1

Ответ принят как подходящий

Вы можете сделать что-то вроде ниже, чтобы проверить, существуют ли какие-либо общие элементы

private static boolean checkIfCommonElementExists(List<Integer> list1, List<String> list2) {
    return IntStream.range(0, Math.min(list1.size(), list2.size()))
            .anyMatch(i -> list1.get(i).equals(Integer.parseInt(list2.get(i),16)));
}

или что-то вроде ниже, чтобы получить индексы общих элементов

private static int[] findCommonElementIndexes(List<Integer> list1, List<String> list2) {
    return IntStream.range(0, Math.min(list1.size(), list2.size()))
            .filter(i -> list1.get(i).equals(Integer.parseInt(list2.get(i),16)))
            .toArray();
}

для данного примера:

List<Integer> l1 = List.of(11, 12, 13, 14, 15);
List<String> l2 = List.of("F", "E", "D", "C", "B");

boolean isCommon = checkIfCommonElementExists(l1, l2);
System.out.println("There's at least one common element at same index: " + isCommon);

System.out.println("Common indices" + Arrays.toString(findCommonElementIndexes(l1,l2)));

выход:

There's at least one common element at same index: true
Common indices: [2]

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