将 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&lt;String&gt; 元素流。或者用更极客的话来说:mainList.stream() 返回一个Stream&lt;ArrayList&lt;String&gt;&gt;,排序。

    对该流调用.map 函数,该函数将返回一个新流,其内容与传递给map 的参数指定的新类型相匹配。这个map 函数将为我们隐藏流中的每个元素。它有一个内置的foreach 语句。为了做到这一点; map 函数将 lambda 表达式作为其参数。 Lambda expression 就像一个简单的内联单行函数。其中有两种数据类型gettin' Jiggy wit it。首先是调用它的流中的数据类型 (mainList.stream())。下一个类型是它将映射到的数据类型,它位于 lambda 表达式的右半部分:u -&gt; u.toArray(new String[0])。这里u 是您选择的标识符,就像使用foreach 语句时一样。前半部分是这样声明的:u -&gt;。和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&lt;String[]&gt;。 (嗯,实际上它返回一个Stream&lt;Object[]&gt;,这很混乱,需要转换,见下文)

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

    现在我们从mainList 流中获得了toArray 正常运行。我们可以简单地将其转储到一个局部变量中:String[][] stringArray = mainList.stream...

将 2D ArrayList of Integers 转换为 2D 原始整数数组

现在,我知道你们中的一些人正在外面。 “这对整数不起作用!”就像我的情况一样。然而,它确实适用于“Ents”,见上文。但是,如果您想要来自Integer 的二维ArrayList 的二维原始int 数组(即ArrayList&lt;ArrayList&lt;Integer&gt;&gt;)。你必须改变那个中[地球]映射。请记住,ArrayLists 不能有原始类型。因此,您不能在ArrayList&lt;Integer&gt; 上致电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-&gt;i Lambda 表达式是Integerint 的简单拆箱,使用允许int = Integer 的隐式自动拆箱。现在,这似乎是一件愚蠢的小事,好像智力有其局限性。在我冒险学习所有这些的过程中:我实际上尝试使用mapToInt(null),因为我期望一个默认行为。不是争论!! ( Sheldon )然后我用我最好的Husker山谷女孩口音说,“毕竟,它mapToInt,我会猜测,就像,84% 的时间 (42x2) 它会像,像,通过 i-&gt;i,像,像,像,像,像,我的天啊!”不用说,我觉得有点……像……this guy。我不知道,为什么它不能那样工作。

嗯,我红眼了,半昏迷半睡着。我可能犯了一些错误;请把它们拖出来,这样我就可以修复它们,如果有更好的方法,请告诉我!

PT

【讨论】:

由于map 采用 Lambda(据说它知道 Lambda 每一侧的数据类型),它应该能够继续传递该数据类型信息。所以,尽管我胡言乱语,我仍然很想回答上面提到的这两个问题:1)为什么map 实际上返回Stream&lt;Object[]&gt; 作为默认行为,而不是 Lambda 表达式返回的类型的流里面? --- 2) 为什么mapToInt 没有i-&gt;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&lt;ArrayList&lt;String&gt;&gt;(或任何List&lt;List&lt;String&gt;&gt;,相应地更改for 循环内的第一行)

【讨论】:

如果我有 ArrayList 并想将其转换为二维数组怎么办? 对不起,我错过了,你现在可能已经想通了……反正就是String[][] array2D = new String[arrayList.size()][]; for (int i = 0; i &lt; 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 转换为包含不同长度数组的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

将 ArrayList 转换为常规字符串数组 [重复]

将字符串的 Java ArrayList 转换为 JavaScript 数组

将字符串数组转换为 Arraylist 的 ArrayList [重复]

将字符串数组转换为 ArrayList [重复]

在Android中将ArrayList转换为String数组

将 ArrayList 转换为特定类型的数组 [重复]