Как я могу избежать внутреннего цикла - PullRequest
4 голосов
/ 08 марта 2020

Как я могу избежать внутреннего l oop и написать это «распределение» только с функциями потока? Редактировать: Я хочу список всех уникальных пар, соединенных вместе, сохраненных в l2. Пример: ввод: String[] l = { "a", "a", "b", "c", "d", "d", "d", "d", "a", "a", "b", "b", "c", "d" };, вывод: [a, a, b, c, d, d, b, b, c, d].

String[] l = { "a", "a", "b", "c", "d", "d", "d", "d", "a", "a" };
String[] l2 = 
        IntStream.iterate(0, i -> i < l.length, i -> i + 2)
        .mapToObj(i -> Objects.hash(l[i], l[i + 1]))
        .distinct()
        .map(h -> {
            for (int j = 0; j < l.length; j += 2) {
                if (h == Objects.hash(l[j], l[j + 1])) {
                    return new String[] { l[j], l[j + 1] };
                }
            }
            return null;
        })
        .flatMap(Arrays::stream)
        .toArray(String[]::new);
System.out.println(Arrays.toString(l2));

Ответы [ 2 ]

5 голосов
/ 08 марта 2020

Я не совсем уверен в том, чего хочет ваш l oop. L oop Джейсона находит все уникальные символы, но похоже, что вы ищете все уникальные пары строк, а затем сплющены. Использование «Objects.ha sh ()» для устранения дублирующих пар неверно, две пары могут быть разными, но иметь одинаковое значение ha sh, поэтому Джейсон прав, чтобы избавиться от этого. Если вы действительно хотите получить список уникальных пар, соединенных вместе, это, вероятно, сработает:

IntStream.range(0, l.length / 2)
  .mapToObj(i -> List.of(l[i * 2], l[i * 2 + 1]))
  .distinct()
  .flatMap(List::stream)
  .toArray(String[]::new);
0 голосов
/ 08 марта 2020

Вам не нужно ничего этого делать. Вы можете в буквальном смысле использовать Different () в потоке, чтобы получить все различные значения.

String[] distinct = Stream.of(l).distinct().toArray(String[]::new);
...