2014-11-29 5 views
0

Привет, мне нужно преобразовать SortedSet> в массив целых чисел, но не уверен, как это сделать.Arrays.asList не сглаживает в Java, что я должен использовать вместо этого?

Это SortedSet я хочу, чтобы преобразовать:

private SortedSet<List<Integer>> coords; 

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

public List<Integer> getCoords() { 
    return Arrays.asList(coords); 
} 

Если я хочу сделать что-то вроде этого , мне придется пройти через весь SortedList и создать новый массив int [] и просто поместить в него все значения? Или есть гораздо лучший способ? Я думал, что Arrays.asList может это сделать, но теперь я смущен!

Спасибо за чтение!

+0

Ваш вопрос не имеет достаточного контекста. У вас есть набор списков целых чисел. Вы хотите, чтобы все целые числа в массиве, или вы хотите поместить списки внутри массива? – luuksen

+1

Элементы вашего 'Set' сами являются' Collections'; так что вы хотите в основном сгладить ваши цели, не так ли? – fge

+2

Ну, 'Set' не является массивом. Во всяком случае, у вас есть набор списков целых чисел, так какой же был бы способ обращения к одному списку? Объединение списков? – kiheru

ответ

3

Arrays.asList() ничего не будет выравниваться!

Что вы хотите, это:

public List<Integer> getCoords() 
{ 
    final List<Integer> ret = new ArrayList<>(); 
    for (final List<Integer> l: coords) 
     ret.addAll(l); 
    return ret; 
} 

С Java 8, один пример будет:

public List<Integer> getCoords() 
{ 
    final List<Integer> ret = new ArrayList<>(); 
    coords.stream().forEach(ret::addAll); 
    return ret; 
} 

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

+0

Или можно использовать магические Java 8 вещи ... –

+0

@BoristheSpider Я только что отредактировал сообщение для этого; возможно, существует более короткий путь, но я не освоил все .flat *() 'еще – fge

+0

' coords.stream(). flatMap (Collection :: stream) .collect (toCollection (ArrayList :: new)) ' это приятный лайнер. –

4

@fge дает вам решение. Однако, если вы используете , вы можете использовать новый API потока и позвонить flatMap (это операция, которую вы ищете).

public List<Integer> getCoords() { 
     return coords.stream() 
        .flatMap(list -> list.stream()) //or .flatMap(List::stream) 
        .collect(Collectors.toList()); 
} 
+1

Даже 'flatMap (Collection :: stream)' будет работать, я считаю – fge

+0

@fge Да, это так. Однако они генерируют один и тот же байт-код. –

+3

Не удивительно! Это красота invokedynamic ... – fge