所以我有:
ArrayList<ArrayList<String>>
其中包含了包含字符串的另一个y个。要证明的ArrayList的x数:
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}}
非常感谢。
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()]);
}
其中arrayList
是您ArrayList<ArrayList<String>>
(或任何List<List<String>>
,改变内部的所述第一线for
相应环路)
欢迎来到世界与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);
巴姆! 一条线。
我不知道它是如何快相比其他选项。 但是,这是它如何工作的:
就拿流mainList
2D ArrayList中。 这种流是一个有点像矢量迷上了一个LinkedList,他们有一个孩子。 这小子,以后的生活中,服用了一些NZT-48 。 我离题; mainList.stream()
是返回流ArrayList<String>
元素。 或者甚至更老派会说: mainList.stream()
返回一个Stream<ArrayList<String>>
,八九不离十。
调用.map
在那个流将与匹配传入参数指定的新类型的内容返回一个新的流函数map
。 此map
功能将在我们为我们流隐蔽的每个元素。 它有一个内置的foreach
语句。 为了做到这一点; 的map
函数采用一个lambda表达式作为其参数。 甲Lambda表达式是像一个简单的直列一个行函数。 其中有两个数据类型刚开了Jiggy运行机智 。 第一是在其它被称为数据的流中的类型( mainList.stream()
接下来的类型是将出映射到它的数据类型,这是在λ表达式的右半: u -> u.toArray(new String[0])
这里u
是你选择的标识符只使用一个像时foreach
语句。 上半年声明此像这样: u ->
。 和像foreach
,可变u
现在将流中的每个元素,因为它通过流迭代。 因此, u
是数据类型的原始流的元素是因为它是他们的。 λ表达式的右半部分显示了如何处理每个元素做: u.toArray(new String[0])
并将结果存储在其应有的位置在一个新的流。 在这种情况下,我们将其转换成String[]
..因为毕竟这是的2D阵列String
..或者说从代码这一点上,的一维数组String[]
字符串数组)。 请记住, u
最终是一个ArrayList
。 注意,调用toArray
从一个ArrayList
对象将创建传递到它的类型的新数组。 下面我们通过在new String[0]
因此它创建类型的新阵列String[]
和长度等于该ArrayList的长度u
。 然后,它填补字符串与内容这一新阵ArrayList
并返回。 这让lambda表达式,并返回到map
。 然后, map
收集这些字符串数组,并与他们创建一个新的数据流,它具有相关联的类型String[]
然后返回。 因此, map
返回一个Stream<String[]>
在这种情况下。 (当然,实际上它返回一个Stream<Object[]>
这是令人困惑的,并且需要转换,见下文)
因此,我们只需要调用toArray
的字符串数组的新流。 但调用toArray
在Stream<Object[]>
比调用它的有点不同ArrayList<String>
,因为我们以前那样。 在这里,我们必须使用一个函数引用困惑的事情。 它抓住此类型: String[][]::new
。 这个new
功能有类型String[][]
基本上,由于函数被调用指定者它将永远是一个[]
某种。 在我们的例子,因为里面的数据是又一个数组,我们只需添加另一个[]
我不知道为什么NZT-48是不工作的这一个。 我本来期望默认调用toArray()
就足够了,看到它的流和所有。 甲流这就是特别Stream<String[]>
任何人都知道为什么map
实际上返回一个Stream<Object[]>
而不是由Lambda表达式内返回的类型的流?
现在,我们得到了toArray
我们mainList
流行事正确。 我们可以只转储到一个局部变量足够简单: String[][] stringArray = mainList.stream...
将integer 2D的ArrayList到原始整数的2D阵列
现在,我知道你们有些人那里去。 “这并不适用于整数工作!” 因为是我的情况。 但它确实为“工作树人 ”,见上面。 但是,如果你想有一个2D原始int
从二维数组ArrayList
的Integer
(即ArrayList<ArrayList<Integer>>
)。 你必须围绕着中间的[土]映射变化。 记住的ArrayList不能有基本类型。 因此,你不能叫toArray
上ArrayList<Integer>
,并期望得到一个int[]
您将需要再次映射出...。
int[][] intArray = mainList.stream().map( u -> u.stream().mapToInt(i->i).toArray() ).toArray(int[][]::new);
我试图空间出来的可读性。 但是你可以看到这里,我们不得不再次通过相同的全映射过程。 这一次,我们不能只是简单地调用toArray
上的ArrayList u
; 与上述的例子。 在这里,我们呼吁toArray
在Stream
不是一个ArrayList
。 所以,由于某种原因,我们没有将它传递一个“类型”,我觉得它的服用脑类固醇。 因此,我们可以采取的默认选项; 它采用的是NZT-48的命中和数字出明显的对于我们这种[运行]时间。 我不知道为什么它不能只是做在上面的例子。 哦,这就是正确的....的ArrayList不采取NZT-48一样流做。 等待...我是什么,甚至谈论在这里?
Annnyhoow,因为流是SOOO智能。 像谢尔顿 ,我们需要一个全新的协议来处理它们。 显然,先进的智能并不意味着容易对付。 因此,这种新的mapToInt
是需要做出一个新的Stream
,我们可以使用它的聪明toArray
。 和i->i
在Lambda表达式mapToInt
是一个简单的开箱Integer
来int
,使用隐式自动拆箱允许int = Integer
。 其中,现在,似乎是一个愚蠢的琐碎的事情,因为如果情报有其局限性。 在我的冒险学习这一切:我真的试图用mapToInt(null)
,因为我期望的默认行为。 不争论! ( 咳嗽 咳谢尔顿)然后我说,在我最好的哈斯克谷女孩的口音,“毕竟,它被称为mapToInt
,我猜,喜欢的时间(84% 42 ×2)将一样,通过i->i
受,想,每个人,所以喜欢,omgawd!” 不用说,我觉得有点像... .. 这家伙 。 不知道为什么它不工作的方式!
嗯,我红眼和神志不清的一半,一半睡着了。 我可能犯了一些错误; 请巨魔出来,所以我可以解决这些问题,让我知道,如果有一个更好的方法!
PT
您可以使用toArray()
方法一个ArrayList转换成数组。 由于您在ArrayList中有ArrayList中,你需要将每个元素遍历并应用此方法。
事情是这样的: -
ArrayList<ArrayList<String>> mainList = new ArrayList<ArrayList<String>>();
// populate this list here
//more code
// convert to an array of ArrayLists
ArrayList<String[]> tempList = new ArrayList<String[]>();
for (ArrayList<String> stringList : mainList){
tempList.add((String[])stringList.toArray());
}
//Convert to array of arrays - 2D array
String [][]list = (String[][])tempList.toArray();
你可以找到更多关于toArray()
在这里。
ArrayList<ArrayList<String>> list= new ArrayList<ArrayList<String>>();
ArrayList<String> a = new ArrayList<String>();
ArrayList<String> b = new ArrayList<String>();
a.add("Hello");
b.add("Hell");
list.add(a);
list.add(b);
Object[][] array = new Object[list.size()][];
Iterator<ArrayList<String>> iterator = list.iterator();
int i = 0;
while(iterator.hasNext()){
array[i] = iterator.next().toArray();
}
您可以使用下面的代码片段到Object []转换为String []
String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
例如:
public String[][] toArray(List<List<String>> list) {
String[][] r = new String[list.size()][];
int i = 0;
for (List<String> next : list) {
r[i++] = next.toArray(new String[next.size()]);
}
return r;
}
这个完整的迷你程序代码,只需回答相当不言自明way.Just粘贴这个问题,并运行它:
import java.util.ArrayList;
import java.util.List;
public class ListTo2Darray {
public String[][] toArray(List<List<?>> list) {
String[][] r = new String[list.size()][];
int i = 0;
for (List<?> next : list) {
r[i++] = next.toArray(new String[next.size()]);
}
return r;
}
public static void main(String[]arg){
String[][] sham;
List<List<?>> mList = new ArrayList();
List<String> a= new ArrayList();
List<String> b= new ArrayList();
a.add("a"); a.add("a");
b.add("b"); b.add("b");
mList.add(a); mList.add(b);
ListTo2Darray mt= new ListTo2Darray();
sham= mt.toArray(mList);
System.out.println(sham[0][0]);
System.out.println(sham[0][1]);
System.out.println(sham[1][0]);
System.out.println(sham[1][1]);
}
}