Java: преобразование массивов массивов в коллекции коллекций и наоборот - PullRequest
0 голосов
/ 02 мая 2009

Пожалуйста, предложите какой-нибудь элегантный способ конвертации
массивы массивов до коллекции коллекций и наоборот в Java.

Полагаю, в Java API нет удобных методов, верно?

public static <T> T[][] nestedCollectionsToNestedArrays(
    Collection<? extends Collection<T>> source){

  // ... ?
}

public static <T> Collection<Collection<T>> nestedArraysToNestedCollections(
    T[][] source){

  // ... ?
}

Дополнительный вопрос:
Что с вложенными массивами примитивных типов ?

Должен ли я объявлять методы для каждого примитивного типа, потому что создания общего массива ?

Ответы [ 2 ]

1 голос
/ 02 мая 2009

для коллекции коллекций -> массив массивов: (он просто возвращает объект [] [], поскольку информация о типе для «T» отсутствует. Вы должны вручную передать класс T, если хотите массив будет правильным типом, и он будет более сложным)

public static Object[][] nestedListsToNestedArrays(
    Collection<? extends Collection<?>> source){
  Object[][] result = new Object[source.size()][];
  int i = 0;
  for (Collection<?> subCollection : source) {
    result[i++] = subCollection.toArray();
  }
  return result;
}

Дополнительный вопрос: что с вложенные массивы примитивных типов? Я должны объявить методы для каждого примитивный тип,

Да, вы можете либо объявить методы для каждого примитивного типа, либо использовать безопасность отражения и жертвования типов. Причина в том, что каждый тип примитивного массива не связан, и нет супертипа для всех типов примитивных массивов, кроме Object.

из-за запрещенного универсального массива создание

Нет, но это причина другого вопроса: почему выше массив массива Collection of Collections -> массивов, возвращающих T [] [].

0 голосов
/ 02 мая 2009

Вот метод для массива-> Коллекция:

public static <T> Collection<Collection<T>>
        nestedArraysToNestedCollections(T[][] source) {
    Collection<Collection<T>> ret = new ArrayList<Collection<T>>();
    for (int i = 0; i < source.length; i++) {
        // could be ret.add(new ArrayList<T>(Arrays.asList(source[i]));
        Collection<T> list = new ArrayList<T>(source[i].length);
        for (int j = 0; j < source[i].length; j++) {
            list.add(source[i][j]);
        }
    }
    return ret;
}

Другое направление намного сложнее.

...