将 ArrayList 转换为包含不同长度数组的二维数组

新手上路,请多包涵

所以我有:

 ArrayList<ArrayList<String>>

其中包含 x 个 ArrayLists,其中包含另一个 y 个字符串。演示:

 Index 0:
  String 1
  String 2
  String 3
Index 1:
  String 4
Index 2:
Index 3:
  String 5
  String 6

其中索引指的是包含字符串的数组索引。

我怎样才能将其转换为二维数组,如下所示:

 {{String1, String2, String3},{String4}, {}, {String5, String6}}

太感谢了。

原文由 Stefan Dunn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 655
2 个回答
String[][] array = new String[arrayList.size()][];
for (int i = 0; i < arrayList.size(); i++) {
    ArrayList<String> row = arrayList.get(i);
    array[i] = row.toArray(new String[row.size()]);
}

where arrayList is your ArrayList<ArrayList<String>> (or any List<List<String>> , change the first line inside the for loop accordingly)

原文由 michele b 发布,翻译遵循 CC BY-SA 3.0 许可协议

欢迎来到 Java 8 的世界!

我只花了一整夜没睡就学会了写这一行该死的代码需要什么。我确定它已经在某处,但我找不到它。所以我正在分享我的研究时间和时间,享受。哇!

假设:

 ArrayList<ArrayList<String>> mainList = new ArrayList<ArrayList<String>>();
// populate this list here

(或者更确切地说,在 Java 8 中:

 ArrayList<ArrayList<String>> mainList = new ArrayList();
//Populate

)

那么你只需要:

 String[][] stringArray = mainList.stream().map(u -> u.toArray(new String[0])).toArray(String[][]::new);

砰!一条线。

我不确定与其他选项相比它有多快。但这就是它的工作原理:

  1. 获取 mainList 2D ArrayList 的流。这个流有点像 Vector 与 LinkedList 挂钩,他们有了一个孩子。那个孩子在晚年服用了一些 NZT-48 。我离题了; mainList.stream() 正在返回 ArrayList<String> 元素流。或者用更怪异的说法: mainList.stream() 返回一个 Stream<ArrayList<String>> ,sorta。

  2. 在该流上调用 .map 函数,该函数将返回一个新流,其内容与传递给 map 的参数指定的新类型相匹配。这个 map 函数将为我们隐藏流中的每个元素。它有一个内置的 foreach 声明。为了做到这一点; map 函数将 lambda 表达式作为其参数。 Lambda 表达式 就像一个简单的内联单行函数。它有两种数据类型 gettin’ Jiggy wit it 。首先是调用它的流中的数据类型 ( mainList.stream() )。下一个类型是它将映射到的数据类型,它位于 lambda 表达式的右半部分: u -> u.toArray(new String[0]) 。这里 u 是您在使用 foreach 语句时选择的标识符。前半部分这样声明: u -> 。和 foreach 一样,变量 u 现在将成为流中遍历流的每个元素。因此, u 是原始流元素的数据类型,因为它 就是 它们。 Lambda 表达式的右半部分显示了如何处理每个元素: u.toArray(new String[0]) 。结果存储在新流中的正确位置。在这种情况下,我们将其转换为 String[] .. 因为毕竟这是一个二维数组 String .. 或者更确切地说,从代码的这一点开始,一维数组 String[] (字符串数组)。请记住 u 最终是一个 ArrayList 。请注意,从 ArrayList 对象调用 toArray 将创建一个传递给它的类型的新数组。这里我们传入 new String[0] 。因此,它创建了一个类型为 String[] 且长度等于 ArrayList u 的新数组。然后它用 ArrayList 的内容填充这个新的字符串数组并返回它。留下 Lambda 表达式并返回 map 。然后, map 收集这些字符串数组并用它们创建一个新流,它具有关联的类型 String[] 然后返回它。因此, map 返回一个 Stream<String[]> ,在这种情况下。 (好吧,实际上它返回一个 Stream<Object[]> ,这是令人困惑的,需要转换,见下文)

  3. 因此,我们只需要在新的字符串数组流上调用 toArray 。但是在 toArray 上调用 ArrayList<String> 与我们之前在 Stream<Object[]> 上调用它有点不同。在这里,我们不得不使用一个函数引用来混淆东西。它从中获取类型: String[][]::new 。那个 new 函数的类型 String[][] 。基本上,由于该函数被称为 toArray ,它始终是某种类型的 [] 。在我们的例子中,因为里面的数据是另一个数组,我们只是添加另一个 [] 。我不确定为什么 NZT-48 没有在这个上工作。我本来希望默认调用 toArray() 就足够了,看到它是一个流和所有。一个特别是 Stream<String[]> 的流。任何人都知道为什么 map 实际上返回一个 Stream<Object[]> 而不是内部Lambda表达式返回的类型的流?

  4. 现在我们从我们的 mainList 流中获得了 toArray --- 正确运行。我们可以很容易地将它转储到局部变量中: String[][] stringArray = mainList.stream...

将整数的二维数组列表转换为原始整数的二维数组

现在,我知道你们中的一些人在那里。 “这对整数不起作用!”就像我的情况一样。然而,它确实适用于“ Ents ”,见上文。 But, if you want a 2D primitive int array from a 2D ArrayList of Integer (ie. ArrayList<ArrayList<Integer>> ).你必须改变中间 [地球] 映射。请记住,ArrayLists 不能有原始类型。因此,您不能在 toArray ArrayList<Integer> 并期望获得 int[] 。你需要把它画出来……再一次。

 int[][] intArray = mainList.stream().map(  u  ->  u.stream().mapToInt(i->i).toArray()  ).toArray(int[][]::new);

为了便于阅读,我试图将它隔开。但是你可以在这里看到,我们必须再次经历相同的整个映射过程。这次我们不能简单地在 ArrayList 上调用 toArray u ;与上面的例子一样。在这里,我们在 toArray Stream 而不是 ArrayList 。所以出于某种原因我们不必给它一个“类型”,我认为它服用了脑类固醇。因此,我们可以采用默认选项;它受到 NZT-48 的影响,并在这个[运行]时间为我们找出显而易见的结果。我不确定为什么它不能在上面的例子中这样做。哦,没错……ArrayLists 不像 Streams 那样采用 NZT-48。等等……我到底在说什么?

Annnyhoow,因为流太聪明了。像 Sheldon 一样,我们需要一个全新的协议来处理它们。显然,高级智能并不总是意味着好对付。因此,需要这个新的 mapToInt 来制作一个新的 Stream 我们可以使用它更聪明的 toArray 。 And the i->i Lambda expression in mapToInt is a simple unboxing of the Integer to int , using the implicit auto-unboxing that allows int = Integer 。现在,这似乎是一件愚蠢而微不足道的事情,好像智力有其局限性。在我学习所有这些的冒险过程中:我实际上尝试使用 mapToInt(null) 因为我期望默认行为。不是争论!! ( 咳嗽 Sheldon _咳嗽_)然后我用我最好的 Husker Valley 女孩口音说,“毕竟,它 叫做 mapToInt ,我猜,84% 的时间 ( 42 x2) 会是,喜欢,通过 i->i 喜欢,每个人,喜欢,omgawd!”不用说,我觉得有点……喜欢…… 这个人。我不知道,为什么它不能那样工作。

好吧,我眼睛红了,神志不清,半睡半醒。我可能犯了一些错误;请把它们找出来,这样我就可以修复它们,如果有更好的方法,请告诉我!

PT

原文由 Pimp Trizkit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题