【问题标题】:How can I convert a 2D String ArrayList to simple 2D String Array?如何将 2D 字符串 ArrayList 转换为简单的 2D 字符串数组?
【发布时间】:2012-06-01 22:02:09
【问题描述】:

我有一个像下面这样的二维数组列表

   ArrayList<ArrayList<String>> childrenSuperList = new ArrayList<ArrayList<String>>();
    ...
    childrenList = new ArrayList<String>();
    ...
    childrenSuperList.add(childrenList);

如何将其转换为简单的字符串数组,例如

String s[][]= {{"a","b","c"},
{"d","e","f"},
{"a","b","c"}
}

【问题讨论】:

    标签: java arraylist multidimensional-array


    【解决方案1】:
    final String[][] r = new String[childrenSuperList.size()][];
    int i = 0;
    for (ArrayList<String> l : childrenSuperList) 
      r[i++] = l.toArray(new String[l.size()]);
    

    【讨论】:

    • 你为什么不使用for(int i = 0; i &lt; n; i++) {循环?看来您尝试使用 for each loop 来模拟此循环。
    • @NikitaBeloglazov 模拟?我迭代ArrayList 并另外跟踪目标数组的索引。这是最短和最干净的代码。为什么我要改用丑陋的childrenSuperList.get(i)
    • 我只是对索引感到不对劲,它逃脱了循环并且可以在循环外访问。在for (int i 循环中,我们将列表的i-th 元素设置为数组的i-th 元素会更加明显。是的,它更冗长,但我认为在某些方面它更清晰。
    • @NikitaBeloglazov 选择是一个丑陋的方法调用 + 一个丑陋的 for 定义,而不是一个逃脱循环范围的 i。无论您选择哪种方式,都不是您或我希望的 100%。我只是碰巧更喜欢第二个选项,特别是如果这三行是转换方法中仅有的三行的话。
    • childrenSuperList.get(i) 性能很差,尤其是链表。这个答案使用了内置的迭代器,效果更好。
    【解决方案2】:

    您的列表可以有不同的大小,因此表格不会有固定的大小,但这没问题。

    ArrayList<ArrayList<String>> childrenSuperList = new ArrayList<ArrayList<String>>();
    // put some data
    ArrayList<String> a = new ArrayList<>();
    a.add("a1");
    a.add("a2");
    ArrayList<String> b = new ArrayList<>();
    b.add("b1");
    b.add("b2");
    b.add("b3");
    
    childrenSuperList.add(a);
    childrenSuperList.add(b);
    
    // you need to know sizes of array
    String[][] array = new String[childrenSuperList.size()][];
    int i = 0, j = 0;
    for (ArrayList<String> row : childrenSuperList) {
        array[i] = new String[row.size()];
        j = 0;
        for (String str : row) {
            array[i][j] = str;
            j++;
        }
        i++;
    }
    System.out.println(Arrays.deepToString(array));
    

    【讨论】:

    • 什么时候可以抛出NullPointerException?我知道childrenSuperList 已初始化。即使列表为空也可以。
    • 认为他说childrenSuperList 可能包含null 元素,这有点极端IMO。你的回答对我来说似乎很好。
    【解决方案3】:

    有一种方法可以从 ArrayList 中获取字符串数组:

    ArrayList listArray = new ArrayList();
    
    listArray.add("One");
    listArray.add("Two");
    listArray.add("Three");
    
    String []strArray = new String[3];
    listArray.toArray(strArray);
    

    【讨论】:

      【解决方案4】:

      以下代码将帮助您获得完美的完整结果。

      public static void main(String[] args) {
      
          ArrayList<ArrayList<String>> val = new ArrayList<ArrayList<String>>();
          int arraySize = 0;
          int upperSize = 0;
      
          if (val != null) {
              ArrayList<String> arrayList = val.get(0);
              upperSize = val.size();
              if (arrayList != null) {
                  arraySize = arrayList.size();
              }
          }
      
          int i = 0, j = 0;
          String[][] values = new String[upperSize][arraySize];
          if (val != null) {
              for (ArrayList<String> curr : val) {
                  if (curr != null) {
                      for (String currValue : curr) {
                          values[i][j++] = currValue;
                      }
                      i++;
                  }
              }
          }
      
      }
      

      【讨论】:

      • 这假设所有内部列表的大小相同,这可能不是真的。
      • @Paul 在问题中没有明确提及这一点,因此我做到了。
      • @BhavikAmbani 这似乎是一个相当大的假设,几乎肯定会证明是错误的。我觉得编写代码取决于真实性,而无需这样做就可以解决问题。
      【解决方案5】:
      import java.util.*;
      

      公共类 HelloWorld{

       public static void main(String []args){
      
           ArrayList<ArrayList<String>> parentList = new ArrayList<ArrayList<String>>();
      
          ArrayList<String> list=new ArrayList<String>();
          list.add("Joshan Stethem");
          list.add("Bruce Wills");
          list.add("Tom Cruse");
          list.add("Optimus Prime");
          System.out.println("Array List Hollywood : "+list);
          ArrayList<String> list1=new ArrayList<String>();
          list1.add("Salman Khan");
          list1.add("Shahrukh Khan");
          list1.add("AMir Khan");
          list1.add("Fawad Khan");   
           System.out.println("Array List Bollywood : "+list1);
             ArrayList<String> list2=new ArrayList<String>();
          list2.add("Rahat Fateh");
          list2.add("Arijit Singh");
          list2.add("KK");
          list2.add("Ankit Tiwari");   
           System.out.println("Array List Singers : "+list2);
          parentList.add(list);
          parentList.add(list1);
          parentList.add(list2);
      
       String[][] twodimArray = new String[parentList.size()][];
           int i = 0, j = 0;
       for (ArrayList<String> row : parentList) {
        twodimArray[i] = new String[row.size()];
         j = 0;
         for (String str : row) {
              twodimArray[i][j] = str;
               j++;
              }
             i++;
            }
       System.out.println("List of Artist : "+Arrays.deepToString(twodimArray));
           }
      

      }

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 2015-09-01
        • 2016-09-12
        • 2016-03-24
        • 2021-05-27
        • 2022-11-18
        • 2017-04-04
        • 2016-09-25
        • 1970-01-01
        相关资源
        最近更新 更多