【问题标题】:Java ArrayList of Arrays?数组的Java ArrayList?
【发布时间】:2011-04-08 05:14:13
【问题描述】:

我想创建一个没有固定大小的多维数组。

我需要能够将String[2] 的项目添加到它。

我试过看:

private ArrayList<String[]> action = new ArrayList<String[2]>();

但这不起作用。有没有人有其他想法?

【问题讨论】:

    标签: java arrays multidimensional-array arraylist


    【解决方案1】:

    应该是

    private ArrayList<String[]> action = new ArrayList<String[]>();
    action.add(new String[2]);
    ...
    

    您不能在泛型参数中指定数组的大小,只能稍后将特定大小的数组添加到列表中。这也意味着编译器不能保证所有子数组的大小相同,必须由你来保证。

    更好的解决方案可能是将其封装在一个类中,您可以在其中确保数组的统一大小作为类型不变量。

    【讨论】:

      【解决方案2】:

      顺便说一句。您应该更喜欢针对接口进行编码。

      private ArrayList<String[]> action = new ArrayList<String[]>();
      

      应该是

      private List<String[]> action = new ArrayList<String[]>();
      

      【讨论】:

      • +1 同意。此外,它通常应该被宣布为最终的。重新绑定容器变量的用例很少。
      • @athena:在 Erich Gamma 采访中查看第一个问题及其答案:goo.gl/fz9G
      【解决方案3】:

      由于你的字符串数组的大小在编译时是固定的,你最好使用一个结构(如Pair),它只要求两个字段,从而避免数组方法可能出现的运行时错误。

      代码:

      由于 Java 不提供 Pair 类,您需要自己定义。

      class Pair<A, B> {
        public final A first;
        public final B second;
      
        public Pair(final A first, final B second) {
          this.first = first;
          this.second = second;
        }
      
        //
        // Override 'equals', 'hashcode' and 'toString'
        //
      }
      

      然后将其用作:

      List<Pair<String, String>> action = new ArrayList<Pair<String, String>>();
      

      [ 这里我使用了List,因为它被认为是对接口进行编程的好习惯。 ]

      【讨论】:

      • +1 我正要给出完全相同的答案。关于是否需要 java.util.Pair 类存在很多争论。我认为是的。
      • 在一定程度上同意 - 您提供的 Pair 类是一个很好的开始,并且是一个很好的概括,因为我发现包含其他 Collections/Arrays 的 Collections/Arrays 是一种代码味道。但是,在这种情况下,很可能 OP 配对的两个字符串彼此之间可能存在某种特殊关系,并且在这种情况下,可能应该有一个自己的类来指定这种关系(并包含特定于一对)。它当然可以是 Pair 的子类。
      • Java 有 java.util.Map.Pair。无需自己定义。
      • @emory:是java.util.Map.Entry。它的名称表明了它的用途,即用作将键和值一起存储在Map 中的结构。它不应该用作存储任何两个元素的通用结构(这是Pair 的用途)。
      【解决方案4】:
      ArrayList<String[]> action = new ArrayList<String[]>();
      

      不需要String[2];

      【讨论】:

        【解决方案5】:

        正如已经回答的那样,您可以创建一个字符串数组的 ArrayList,如 @Péter Török 所写;

            //Declaration of an ArrayList of String Arrays
            ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();
        

        当给这个ArrayList分配不同的String Array时,每个String Array的长度都会不同。

        在下面的例子中,添加了 4 个不同的字符串数组,它们的长度是不同的。

        String Array #1: len: 3
        String Array #2: len: 1
        String Array #3: len: 4
        String Array #4: len: 2
        

        演示代码如下;

        import java.util.ArrayList;
        
        public class TestMultiArray {
        
            public static void main(String[] args) {
                //Declaration of an ArrayList of String Arrays
                ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();
        
                //Assignment of 4 different String Arrays with different lengths
                listOfArrayList.add( new String[]{"line1: test String 1","line1: test String 2","line1: test String 3"}  );
                listOfArrayList.add( new String[]{"line2: test String 1"}  );
                listOfArrayList.add( new String[]{"line3: test String 1","line3: test String 2","line3: test String 3", "line3: test String 4"}  );
                listOfArrayList.add( new String[]{"line4: test String 1","line4: test String 2"}  );
        
                // Printing out the ArrayList Contents of String Arrays
                // '$' is used to indicate the String elements of String Arrays
                for( int i = 0; i < listOfArrayList.size(); i++ ) {
                    for( int j = 0; j < listOfArrayList.get(i).length; j++ )
                        System.out.printf(" $ " + listOfArrayList.get(i)[j]);
        
                    System.out.println();
                }
        
            }
        }
        

        输出如下;

         $ line1: test String 1 $ line1: test String 2 $ line1: test String 3
         $ line2: test String 1
         $ line3: test String 1 $ line3: test String 2 $ line3: test String 3 $ line3: test String 4
         $ line4: test String 1 $ line4: test String 2
        

        同时通知您可以初始化一个新的 Sting 数组,如下所示;

        new String[]{ str1, str2, str3,... }; // Assuming str's are String objects
        

        所以这和;

        String[] newStringArray = { str1, str2, str3 }; // Assuming str's are String objects
        

        我写这个演示只是为了表明没有ArrayList对象,所有元素都是对不同实例化字符串数组的引用,因此每个字符串数组的长度不必是一样,都不重要。

        最后一点:最好在 List 接口中使用 ArrayList,而不是您在问题中使用的那个。

        最好使用下面的List接口;

            //Declaration of an ArrayList of String Arrays
            List<String[]> listOfArrayList = new ArrayList<String[]>();
        

        【讨论】:

          【解决方案6】:

          这很好用。

          ArrayList<String[]> a = new ArrayList<String[]>();
              a.add(new String[3]);
              a.get(0)[0] = "Zubair";
              a.get(0)[1] = "Borkala";
              a.get(0)[2] = "Kerala";
          System.out.println(a.get(0)[1]);
          

          结果将是

          Borkala
          

          【讨论】:

            【解决方案7】:
            1. ArrayList action一样创建ArrayList。

              在 JDK 1.5 或更高版本中使用 ArrayList &lt;string[]&gt; 引用名称。

              在 JDK 1.4 或更低版本中使用 ArrayList 引用名称。

            2. 指定访问说明符:

              • 公开,任何地方都可以访问
              • 私有,在类内访问
              • 受保护,在类和不同的包子类中访问
            3. 然后指定它将被分配到的引用

              action = new ArrayList<String[]>();
              
            4. 在JVM中new关键字会在运行时为对象分配内存。

              你不应该在声明的地方赋值,因为你问的是没有固定大小的。

            5. 终于可以在ArrayList中使用add()方法了。像这样使用

              action.add(new string[how much you need])
              

              它将在堆中分配特定的内存区域。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-24
              • 2018-12-20
              • 2012-05-15
              • 1970-01-01
              • 2018-11-26
              • 2023-03-31
              相关资源
              最近更新 更多