Ste*_*unn 23 java indexing arraylist multidimensional-array varying
所以我有:
ArrayList<ArrayList<String>>
Run Code Online (Sandbox Code Playgroud)
其中包含x个包含另外y个字符串的ArrayLists.演示:
Index 0:
String 1
String 2
String 3
Index 1:
String 4
Index 2:
Index 3:
String 5
String 6
Run Code Online (Sandbox Code Playgroud)
其中index是指包含字符串的数组索引.
如何将其转换为2D数组,如下所示:
{{String1, String2, String3},{String4}, {}, {String5, String6}}
Run Code Online (Sandbox Code Playgroud)
非常感谢.
mic*_*e b 31
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()]);
}
Run Code Online (Sandbox Code Playgroud)
其中arrayList是您的ArrayList<ArrayList<String>>(或任何List<List<String>>,改变内部的第一行for相应地循环)
Pim*_*kit 28
欢迎来到Java 8的世界!
它只花了我一整夜都没有睡觉才能学习写这一段令人讨厌的代码所需要的东西.我确定它已经出现在某个地方,但我找不到它.所以我分享我的研究时间和时间,享受.活泉!
假设:
ArrayList<ArrayList<String>> mainList = new ArrayList<ArrayList<String>>();
// populate this list here
Run Code Online (Sandbox Code Playgroud)
(或者,相反,在Java 8中:
ArrayList<ArrayList<String>> mainList = new ArrayList();
//Populate
Run Code Online (Sandbox Code Playgroud)
)
那你需要的只是:
String[][] stringArray = mainList.stream().map(u -> u.toArray(new String[0])).toArray(String[][]::new);
Run Code Online (Sandbox Code Playgroud)
巴姆!一条线.
我不确定与其他选项相比有多快.但这是它的工作原理:
获取mainList2D ArrayList 的流.这个流有点像一个与LinkedList连接的Vector,他们有一个孩子.那个孩子,在以后的生活中,在一些NZT-48上服用.我离题了; mainList.stream()正在返回一个ArrayList<String>元素流.或者甚至是更古怪的说法:mainList.stream()返回a Stream<ArrayList<String>>,sorta.
.map在该流上调用该函数,该函数将返回一个新流,其内容与传入的参数指定的新类型相匹配map.此map函数将为我们转换流中的每个元素.它有一个内置的foreach声明.为了做到这一点; 该map函数将lambda表达式作为其参数.甲Lambda表达式是像一个简单的直列一个行函数.其中有两种数据类型gettin'Jiggy wit it.首先是调用它的流中的数据类型(mainList.stream()).下一个类型是它将它映射到的数据类型,它位于lambda表达式的右半部分:u -> u.toArray(new String[0]).这u是您选择的标识符,就像使用foreach语句一样.上半场就这样说:u ->.和a一样foreach,变量u现在是流中的每个元素,因为它在流中迭代.因此,u原始流的元素是数据类型,因为它们是它们.Lambda表达式的右半部分显示了如何处理每个元素:u.toArray(new String[0]).将结果存储在新流中的合法位置.在这种情况下,我们将它转换为String[]..因为毕竟,这是一个...的数组的2D数组,String或者更确切地说是代码中的这一点,是一个String[](字符串数组)的一维数组.请记住,这u最终是一个ArrayList.注意,toArray从ArrayList对象调用将创建一个传递给它的类型的新数组.在这里我们传入new String[0].因此,它创建一个新的类型数组,String[]其长度等于ArrayList的长度u.然后它用the的内容填充这个新的字符串数组ArrayList并返回它.这留下了Lambda表达式并重新进入map.然后,map收集这些字符串数组并使用它们创建一个新流,它具有关联的类型String[],然后返回它.因此,在这种情况下map返回a Stream<String[]>.(嗯,实际上它会返回一个Stream<Object[]>,这很混乱,需要转换,见下文)
因此,我们只需要调用toArray新的字符串数组流.但是调用toArraya Stream<Object[]>与调用它有点不同ArrayList<String>,正如我们之前所做的那样.在这里,我们必须使用函数引用令人困惑的事情.它抓住了这种类型:String[][]::new.该new函数有类型String[][].基本上,因为函数被调用toArray它总是[]某种类型.在我们的例子中,因为里面的数据是另一个数组,我们只是添加另一个[].我不确定为什么NZT-48没有在这个上工作.我本来期望默认调用toArray()就足够了,看到它是一个流和所有.特别是一条流Stream<String[]>.任何人都知道为什么map实际返回一个Stream<Object[]>而不是Lambda表达式返回的类型的流?
现在我们toArray从我们的mainList流中得到了正确的行动.我们可以很容易地将它转储到局部变量中:String[][] stringArray = mainList.stream...
现在,我知道有些人在外面."这不适用于整数!" 就像我的情况一样.然而,它确实适用于" Ents ",见上文.但是,如果你想有一个基本的2D int从二维数组ArrayList的Integer(即ArrayList<ArrayList<Integer>>).你必须改变中间[地球]的映射.请记住,ArrayLists不能具有基本类型.因此,你不能打电话toArray的ArrayList<Integer>,并期望得到一个int[].你需要再次将它映射出来.
int[][] intArray = mainList.stream().map( u -> u.stream().mapToInt(i->i).toArray() ).toArray(int[][]::new);
Run Code Online (Sandbox Code Playgroud)
为了便于阅读,我试图将其分开.但是你可以在这里看到我们必须再次完成相同的整个映射过程.这次我们不能简单地调用toArrayArrayList u; 与上面的例子一样.在这里,我们呼吁toArray的Stream不是ArrayList.因此,出于某种原因,我们不必将它传递给"类型",我认为它服用大脑类固醇.因此,我们可以采用默认选项; 在那里它受到了NZT-48的打击,并为我们这个[运行]时间找出了明显的结果.我不确定为什么它不能在上面的例子中做到这一点.哦,没错...... ArrayLists不像Streams那样服用NZT-48.等等......我甚至在这里谈论什么?
Annnyhoow,因为溪流非常聪明.像谢尔顿一样,我们需要一个全新的协议来处理它们.显然,先进的情报并不总是意味着易于处理.因此,mapToInt需要这个新的东西来制作一个Stream我们可以更聪明地使用它的新东西toArray.而i->i在Lambda表达式mapToInt是的一个简单的拆箱Integer到int,使用隐式自动拆箱允许int = Integer.现在,这似乎是一件愚蠢的事情,好像情报有其局限.在我的冒险中学习所有这些:我实际上试图使用,mapToInt(null)因为我期望默认行为.不是争论!! (咳嗽 Sheldon 咳嗽)然后我用我最好的Husker山谷女孩口音说,"毕竟,它被称为mapToInt,我猜想,就像,84%的时间(42 x2)它会像,通过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();
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到更多相关信息toArray()
| 归档时间: |
|
| 查看次数: |
56384 次 |
| 最近记录: |