int [] в Hashset (Java) - PullRequest
       60

int [] в Hashset (Java)

0 голосов
/ 26 октября 2018

возможная копия Java int [] массива в HashSet , но плохо ответил на столь новый вопрос.

У меня есть набор, который я пытаюсь объявить:

int[] flattened = Arrays.stream(arcs).flatMapToInt(Arrays::stream).toArray();
Set<Integer> set = new HashSet<Integer>(Arrays.asList(flattened));

, но так как тип возвращаемого значения Arrays.asList является самим списком, он не может разрешиться.Какой лучший способ превратить список int[] в Set<Integer>

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

.. Какой лучший способ превратить список для int [] в Set

В этом случае вы можете использовать:

List<int[]> arcs = ...;
Set<Integer> set = arcs.stream()
        .flatMapToInt(Arrays::stream)
        .boxed()
        .collect(Collectors.toSet());

Пример:

List<int[]> arcs = new ArrayList<>(Arrays.asList(new int[]{1, 2, 3}, new int[]{3, 4, 6}));

Выходы

[1, 2, 3, 4, 6]

Примечание: как Джек упомянуть, чтобы гарантированный сбор был HashSetвы можете собрать так:

...
.collect(Collectors.toCollection(() -> new HashSet<>()));
0 голосов
/ 26 октября 2018

Вы должны быть в состоянии сделать это как однострочник, например:

Set<Integer> set = Arrays.stream(arcs).flatMapToInt(Arrays::stream).collect(Collectors.toSet());

Обновлено: Джек комментирует ниже, что Collectors.toSet () не гарантирует возврат HashSet - на практике я думаю, что обычно это происходит, но никаких гарантий - поэтому было бы лучше использовать:

Set<Integer> set = Arrays.stream(arcs).flatMapToInt(Arrays::stream)
  .collect(Collectors.toCollection(() -> new HashSet<>()));

И, как указывает DodgyCodeException, в примере OP возникла дополнительная проблема, которую я не решал, поэтому настройте ее следующим образом:

Set<Integer> set = Arrays.stream(arcs)
    .flatMapToInt(Arrays::stream)
    .boxed() // <-- converts from IntStream to Stream<Integer>
    .collect(Collectors.toCollection(() -> new HashSet<>()));
...