将 ArrayList 转换为包含不同长度数组的二维数组
Posted
技术标签:
【中文标题】将 ArrayList 转换为包含不同长度数组的二维数组【英文标题】:Convert ArrayList into 2D array containing varying lengths of arrays 【发布时间】:2012-04-20 01:19:34 【问题描述】:所以我有:
ArrayList<ArrayList<String>>
其中包含 x 个数组列表,其中包含另一个 y 个字符串.. 演示:
Index 0:
String 1
String 2
String 3
Index 1:
String 4
Index 2:
Index 3:
String 5
String 6
其中 index 是指包含字符串的数组索引。
如何将其转换为二维数组,如下所示:
String1, String2, String3,String4, , String5, String6
非常感谢。
【问题讨论】:
这是一个涉及 int 数组(原始数据类型)***.com/a/62973865/6648326 的答案 【参考方案1】:queries=[[1,5,3],[4,8,7],[6,9,1]]
h=queries.size();
for(i=0;i<h;i++)
for(j=0;j<3;j++)
y[i][j]= ( ( queries.get(i) ).get(j) );
它将在 y[i][j] 处首先在此语句中查询。get(i) 将选择列表的第一个块,即在 i=0 时它将选择 [1,5,3]然后在 j=0 时,它将从 [1,5,3] 中选择 1,依此类推..
循环解释: y[][]=[ 1 5 3 4 8 7 6 9 1]
注意:用您给定的数组替换查询。
请让我知道它是否有效,或者我应该提供另一种解决问题的方法
【讨论】:
【参考方案2】:欢迎来到 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 的 Vector 并且他们有了一个孩子。那个孩子,在以后的生活中,服用了一些NZT-48。我离题了; mainList.stream()
正在返回 ArrayList<String>
元素流。或者用更极客的话来说:mainList.stream()
返回一个Stream<ArrayList<String>>
,排序。
对该流调用.map
函数,该函数将返回一个新流,其内容与传递给map
的参数指定的新类型相匹配。这个map
函数将为我们隐藏流中的每个元素。它有一个内置的foreach
语句。为了做到这一点; map
函数将 lambda 表达式作为其参数。 Lambda expression 就像一个简单的内联单行函数。其中有两种数据类型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[]>
,这很混乱,需要转换,见下文)
因此,我们只需要在新的字符串数组流上调用toArray
。但是在Stream<Object[]>
上调用toArray
与在ArrayList<String>
上调用它有点不同,就像我们之前所做的那样。在这里,我们不得不使用一个函数引用令人困惑的东西。它从中获取类型:String[][]::new
。 new
函数的类型为 String[][]
。基本上,由于该函数被称为 toArray,因此它始终是某种[]
。在我们的例子中,因为里面的数据是另一个数组,我们只是添加了另一个[]
。我不确定为什么 NZT-48 不能在这个上工作。我本来希望对toArray()
的默认调用就足够了,因为它是一个流和所有内容。一个特别是Stream<String[]>
的流。有谁知道为什么map
实际上返回一个Stream<Object[]>
而不是内部 Lambda 表达式返回的类型的流?
现在我们从mainList
流中获得了toArray
正常运行。我们可以简单地将其转储到一个局部变量中:String[][] stringArray = mainList.stream...
将 2D ArrayList of Integers 转换为 2D 原始整数数组
现在,我知道你们中的一些人正在外面。 “这对整数不起作用!”就像我的情况一样。然而,它确实适用于“Ents”,见上文。但是,如果您想要来自Integer
的二维ArrayList
的二维原始int
数组(即ArrayList<ArrayList<Integer>>
)。你必须改变那个中[地球]映射。请记住,ArrayLists 不能有原始类型。因此,您不能在ArrayList<Integer>
上致电toArray
并期望得到int[]
。您将需要重新绘制它...。
int[][] intArray = mainList.stream().map( u -> u.stream().mapToInt(i->i).toArray() ).toArray(int[][]::new);
为了便于阅读,我尝试将其隔开。但是您可以在这里看到,我们必须再次经历相同的整个映射过程。这一次我们不能简单地在 ArrayList 上调用toArray
u
;和上面的例子一样。在这里,我们在 Stream
而不是 ArrayList
上调用 toArray
。因此,出于某种原因,我们不必将其传递给“类型”,我认为它正在服用大脑类固醇。因此,我们可以采用默认选项;它需要 NZT-48 的打击,并在这个 [运行] 时间为我们找出显而易见的东西。我不确定为什么它不能在上面的例子中做到这一点。哦,没错.... ArrayLists 不像 Streams 那样采用 NZT-48。等等……我到底在说什么?
Annnyhoow,因为流非常聪明。就像Sheldon 一样,我们需要一个全新的协议来处理它们。显然,先进的智能并不总是意味着容易处理。因此,需要这个新的mapToInt
来创建一个新的Stream
,我们可以使用它更智能的toArray
。而mapToInt
中的i->i
Lambda 表达式是Integer
到int
的简单拆箱,使用允许int = Integer
的隐式自动拆箱。现在,这似乎是一件愚蠢的小事,好像智力有其局限性。在我冒险学习所有这些的过程中:我实际上尝试使用mapToInt(null)
,因为我期望一个默认行为。不是争论!! (咳 Sheldon 咳)然后我用我最好的Husker山谷女孩口音说,“毕竟,它是叫mapToInt
,我会猜测,就像,84% 的时间 (42x2) 它会像,像,通过 i->i
,像,像,像,像,像,我的天啊!”不用说,我觉得有点……像……this guy。我不知道,为什么它不能那样工作。
嗯,我红眼了,半昏迷半睡着。我可能犯了一些错误;请把它们拖出来,这样我就可以修复它们,如果有更好的方法,请告诉我!
PT
【讨论】:
由于map
采用 Lambda(据说它知道 Lambda 每一侧的数据类型),它应该能够继续传递该数据类型信息。所以,尽管我胡言乱语,我仍然很想回答上面提到的这两个问题:1)为什么map
实际上返回Stream<Object[]>
作为默认行为,而不是 Lambda 表达式返回的类型的流里面? --- 2) 为什么mapToInt
没有i->i
的默认用法?
我使用了你的答案pastebin.com/iNkwetbW。当我在 IntelliJ IDEA 中编码时,我收到一条警告,它会覆盖多个方法。如何删除这些警告?
覆盖?这似乎很奇怪。我不会说这行代码覆盖了任何东西。但我不知道 IntelliJ IDEA 是什么以及它所处的环境。我帮不上什么忙。我希望这里的其他人阅读此内容并可以帮助您。也许开始将声明分解成更小的部分并单独测试它们,看看问题出在哪里。例如,尝试从ArrayList
中拉出.stream()
,然后将其打印到屏幕上以确保部件正常工作。然后转到.map()
...等
我会选择 new ArrayList() (而不是 new ArrayList())
如果有人需要工作代码来将 int 的二维数组转换为列表 - ***.com/a/62973891/6648326【参考方案3】:
这个完整的小程序代码非常不言自明地回答了这个问题。只需粘贴并运行它:
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]);
【讨论】:
【参考方案4】:例如:
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;
【讨论】:
【参考方案5】: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
循环内的第一行)
【讨论】:
如果我有 ArrayListString[][] array2D = new String[arrayList.size()][]; for (int i = 0; i < array2D.length; i++) String[] row = arrayList.get(i); array2D[i] = row;
不适合我。最终的二维数组每行只有一列。
你检查的怎么样?你的输入是什么样的?【参考方案6】:
您可以使用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()
here.的信息
【讨论】:
【参考方案7】: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();
您可以使用下面的 sn-p 将 Object[] 转换为 String[]
String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
【讨论】:
以上是关于将 ArrayList 转换为包含不同长度数组的二维数组的主要内容,如果未能解决你的问题,请参考以下文章
将字符串的 Java ArrayList 转换为 JavaScript 数组
将字符串数组转换为 Arraylist 的 ArrayList [重复]