【问题标题】:Java: Converting arrays of arrays to collections of collections and vice versaJava:将数组数组转换为集合集合,反之亦然
【发布时间】:2010-10-23 06:09:26
【问题描述】:

请提出一些优雅的方法来将
数组数组转换为集合集合,反之亦然。

我想 Java API 中没有便捷的方法,对吧?

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

  // ... ?
}

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

  // ... ?
}

其他问题:
原始类型的嵌套数组有什么用?

我是否必须为每个原始类型声明方法,因为 被禁止的通用数组创建

【问题讨论】:

    标签: java arrays data-structures collections


    【解决方案1】:

    for Collection of Collections -> 数组数组:(它只返回一个 Object[][],因为“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[][] 的数组数组很难。

    【讨论】:

      【解决方案2】:

      这里是array->Collection的方法:

      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;
      }
      

      另一个方向要复杂得多。

      【讨论】:

      • 没什么,但我想如果这将是一个库方法,他还不如稍微快一点。当然,增强的 for 循环将来可能会更快结束,所以它有点平衡。
      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 2012-06-15
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多