如何在Java中创建动态二维数组?

38

我想动态创建一个二维数组。

我知道列数,但是行数会动态改变。我尝试过使用数组列表,但它只能存储单个维度的值。我该怎么办?


3
你尝试过使用列表的列表吗?类似于List<List<Integer>>。 - Algiz
9个回答

46

由于列数是常量,您可以只使用一个List来存储int[]

    import java.util.*;
    //...

    List<int[]> rowList = new ArrayList<int[]>();

    rowList.add(new int[] { 1, 2, 3 });
    rowList.add(new int[] { 4, 5, 6 });
    rowList.add(new int[] { 7, 8 });

    for (int[] row : rowList) {
        System.out.println("Row = " + Arrays.toString(row));
    } // prints:
      // Row = [1, 2, 3]
      // Row = [4, 5, 6]
      // Row = [7, 8]

    System.out.println(rowList.get(1)[1]); // prints "5"

由于它是由 List 支持的,所以行数可以动态增长和缩小。每一行都由一个静态的 int[] 支持,但你说列数是固定的,所以这不是一个问题。


1
实现具有固定行但可变列的ArrayList需要进行哪些更改? - Hellboy
这是什么样的回答?如果我们想要定义任何常量,我们可以简单地使用一个数组... Java 是否有类似于 C++ 的向量类,您可以动态添加行和列(而无需编写自己的代码)? - user2052717

20

Java中没有多维数组,但是有数组的数组。

只需创建一个大小为所需的一位数组,然后对于每个元素,创建另一个所需大小的数组。

int array[][];

array = new int[10][];

array[0] = new int[9];
array[1] = new int[8];
array[2] = new int[7];
array[3] = new int[6];
array[4] = new int[5];
array[5] = new int[4];
array[6] = new int[3];
array[7] = new int[2];
array[8] = new int[1];
array[9] = new int[0];

或者:

List<Integer>[] array;

array = new List<Integer>[10];

// of you can do "new ArrayList<Integer>(the desired size);" for all of the following
array[0] = new ArrayList<Integer>();
array[1] = new ArrayList<Integer>();
array[2] = new ArrayList<Integer>();
array[3] = new ArrayList<Integer>();
array[4] = new ArrayList<Integer>();
array[5] = new ArrayList<Integer>();
array[6] = new ArrayList<Integer>();
array[7] = new ArrayList<Integer>();
array[8] = new ArrayList<Integer>();
array[9] = new ArrayList<Integer>();

应该被接受,因为它展示了使用ArrayList的实际方式,包括有和没有“-”的情况。 - Tobiq

3

2维字符串数组的另一个例子:

public void arrayExam() {
    List<String[]> A = new ArrayList<String[]>();
    A.add(new String[] {"Jack","good"});
    A.add(new String[] {"Mary","better"});
    A.add(new String[] {"Kate","best"});
    for (String[] row : A) {
        Log.i(TAG,row[0] + "->" + row[1]);
    }
}

输出:

17467 08-02 19:24:40.518  8456  8456 I MyExam  : Jack->good
17468 08-02 19:24:40.518  8456  8456 I MyExam  : Mary->better
17469 08-02 19:24:40.518  8456  8456 I MyExam  : Kate->best

1
这是一个简单的例子。 该方法将返回一个二维的 tType 数组。
public tType[][] allocate(Class<tType> c,int row,int column){
        tType [][] matrix = (tType[][]) Array.newInstance(c,row);
        for (int i = 0; i < column; i++) {
            matrix[i] = (tType[]) Array.newInstance(c,column);
        }
        return matrix;

    }

假设你需要一个二维字符串数组,则调用此函数:

String [][] stringArray = allocate(String.class,3,3);

这将为您提供一个具有3行和3列的二维字符串数组; 请注意,在Class<tType> c中,c不能是原始类型,比如说intchardouble。它必须是非原始类型,比如StringDoubleInteger等。

1
这段代码在我的电脑上无法编译,我在“tType”处遇到了编译错误。你能提供完整的代码吗? - R71

1
尝试创建 Treemap < Integer, Treemap<Integer, obj> > 在Java中,Treemap是有序映射。行和列中的项目数量不会影响您想要设置的二维索引。然后,您可以获得类似于列-行表格的结构。

在Java中实现一个可调整大小的二维数组的好方法是使用泛型。但需要注意的是,由于原始类型不能作为Treemap的键,因此必须使用Integer。 - Oliver Hausler

1
怎么样创建一个包含数组的自定义类,然后使用该自定义类的数组呢?

0
Scanner sc=new Scanner(System.in) ;
int p[][] = new int[n][] ;
for(int i=0 ; i<n ; i++)
{
    int m = sc.nextInt() ;      //Taking input from user in JAVA.
    p[i]=new int[m] ;       //Allocating memory block of 'm' int size block.

    for(int j=0 ; j<m ; j++)
    {
         p[i][j]=sc.nextInt();   //Initializing 2D array block.
    }
 }

2
请添加一些解释 - 仅有代码块并不是很有信息量。 - CertainPerformance

0

如果你想初始化一个二维数组并分配数组大小,那么一个例子如下:

   public static void main(String args[])
   { 
    char arr[][];   //arr is 2d array name
    arr = new char[3][3]; 
    }


   //this is a way to inialize a 2d array in java....  

0
List<Integer>[] array;  
array = new List<Integer>[10]; 

@TofuBeer的答案中第二种情况是不正确的,因为无法使用泛型创建数组。您可以使用以下方法:

List<List<Integer>> array = new ArrayList<>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接