Как преобразовать двухмерный массив в Set? - PullRequest
0 голосов
/ 17 января 2019

для примера у меня есть Foo Объект, тогда у меня есть Foo Данные внутри 2-го массива Foo[][]. Я хочу преобразовать его в Set<Foo>, чтобы просто получить уникальные данные Set of Foo. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 17 января 2019
public <T> List<T> twoDArrayToList(T[][] twoDArray) {
    List<T> list = new ArrayList<T>();
    for (T[] array : twoDArray) {
        list.addAll(Arrays.asList(array));
    }
    return list;
}
0 голосов
/ 17 января 2019

Простым (но не самым эффективным) решением было бы использование потоков Java:

Set<Foo> set = Arrays.stream(array)
    .flatMap(Arrays::stream)
    .collect(Collectors.toSet());

Приведенный выше фрагмент кода сначала создает Stream<Foo[]> с оператором Arrays.stream(array).

Затем он сглаживает этот поток в Stream<Foo> со вторым оператором: .flatMap(Arrays::stream), который ведет себя так же, как .flatMap(arr -> Arrays.stream(arr)).

Наконец, он создает Set<Foo> из сплющенного потока с .collect(Collectors.toSet()).

Я предлагаю более подробно изучить Java Streaming API, представленный в Java 8. Он может сделать гораздо больше, чем просто отобразить 2d-массив в Set.


Другой подход заключается в использовании двух вложенных циклов:

Set<Foo> set = new HashSet<>(); // or LinkedHashSet if you need a similar order than the array
for(Foo[] inner : array) {
    for(Foo item : inner) {
        set.add(item);
    }
}
...