【发布时间】:2011-04-08 05:14:13
【问题描述】:
我想创建一个没有固定大小的多维数组。
我需要能够将String[2] 的项目添加到它。
我试过看:
private ArrayList<String[]> action = new ArrayList<String[2]>();
但这不起作用。有没有人有其他想法?
【问题讨论】:
标签: java arrays multidimensional-array arraylist
我想创建一个没有固定大小的多维数组。
我需要能够将String[2] 的项目添加到它。
我试过看:
private ArrayList<String[]> action = new ArrayList<String[2]>();
但这不起作用。有没有人有其他想法?
【问题讨论】:
标签: java arrays multidimensional-array arraylist
应该是
private ArrayList<String[]> action = new ArrayList<String[]>();
action.add(new String[2]);
...
您不能在泛型参数中指定数组的大小,只能稍后将特定大小的数组添加到列表中。这也意味着编译器不能保证所有子数组的大小相同,必须由你来保证。
更好的解决方案可能是将其封装在一个类中,您可以在其中确保数组的统一大小作为类型不变量。
【讨论】:
顺便说一句。您应该更喜欢针对接口进行编码。
private ArrayList<String[]> action = new ArrayList<String[]>();
应该是
private List<String[]> action = new ArrayList<String[]>();
【讨论】:
由于你的字符串数组的大小在编译时是固定的,你最好使用一个结构(如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,因为它被认为是对接口进行编程的好习惯。 ]
【讨论】:
java.util.Map.Entry。它的名称表明了它的用途,即用作将键和值一起存储在Map 中的结构。它不应该用作存储任何两个元素的通用结构(这是Pair 的用途)。
ArrayList<String[]> action = new ArrayList<String[]>();
不需要String[2];
【讨论】:
正如已经回答的那样,您可以创建一个字符串数组的 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[]>();
【讨论】:
这很好用。
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
【讨论】:
像ArrayList action一样创建ArrayList。
在 JDK 1.5 或更高版本中使用 ArrayList <string[]> 引用名称。
在 JDK 1.4 或更低版本中使用 ArrayList 引用名称。
指定访问说明符:
然后指定它将被分配到的引用
action = new ArrayList<String[]>();
在JVM中new关键字会在运行时为对象分配内存。
你不应该在声明的地方赋值,因为你问的是没有固定大小的。
终于可以在ArrayList中使用add()方法了。像这样使用
action.add(new string[how much you need])
它将在堆中分配特定的内存区域。
【讨论】: