繁体   English   中英

动态二维数组

[英]Dynamic two dimensional array

如何在Java中创建动态二维数组,以及如何获取和设置其元素以及遍历所有元素?

我看到了这篇文章。 但是在文章中,其中一个维度(行数)是已知的并且是固定的,但在我的情况下,两者都是可变的。

这是不可能的,数组的长度始终是静态的。

尝试使用列表列表。

LinkedList<LinkedList<String>> list = new LinkedList<LinkedList<String>>();

list.add(new LinkedList<String>()); // [[]]
list.get(0).add("hello"); // [["hello"]]
list.get(0).add("world"); // [["hello", "world"]]

list.add(new LinkedList<String>()); // [["hello", "world"], []]
list.get(1).add("bonjour"); // [["hello", "world"], ["bonjour"]]

该列表可以使用任何类代替String。

要遍历列表,您需要执行以下操作:

for(LinkedList<String> subList : list){
    for(String str : subList){
        ...
    }
}

您将要使用List或ArrayList,它允许使用具有不同数据类型的二维数组,并且可以根据需要添加/删除行。

二维数组列表

尝试使用类似这样的东西。

ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>();
ArrayList<String> tempList = new ArrayList<String>();
tempList.add("one");
tempList.add("two");

listOfLists.add(tempList);

具有类似功能的任何数据结构都可以做到。

就像其他人回答的那样,在Java中我们不能拥有具有动态长度的数组。 为了解决这个问题,您可以使用java.util.ArrayList东西。 我们可以继续将实体添加到ArrayList而无需给出该List的最终大小。

ArrayList这样的类能够做到这一点,因为它们会在自己内部不断创建新的数组来存储数据。 ArrayList<String>最初会创建一个大小为10(这是示例大小)的String[]数组,但是当您向ArrayList添加第11个元素时,它将创建一个新的大小为20的String [](同样,示例大小)并将旧数组的内容复制到新数组中。

为了快速创建新数组,它使用以下方法: System.arrayCopy(Object src, int srcPos, Object dest, int destPos, int length)

因此,您可以从技术上做同样的事情。 每当您需要更大尺寸的阵列时:

  • 创建更大的新数组
  • 将旧内容复制到新内容
  • 丢弃旧阵列

这是一个二维字符串数组列表的示例:

import java.util.ArrayList;

public class Matrix {
    ArrayList<ArrayList<String>> matrix;

    Matrix () {
        matrix = new ArrayList<>();
    }

    void set(int i, int j, String value) {
        while (matrix.size() <= i) {
            matrix.add(new ArrayList<String>());
        }
        while (matrix.get(i).size() <= j) {
            matrix.get(i).add("");
        }
        matrix.get(i).set(j, value);
    }

    String get(int i, int j) {
        try {
            return matrix.get(i).get(j);
        } catch (IndexOutOfBoundsException e) {
            return "";
        }
    }

    ArrayList<ArrayList<String>> getMatrix() {
        return matrix;
    }
}

这是填充数组并遍历元素的方法:

Matrix matrix;
matrix = new Matrix();
matrix.set(3, 5, "You");
matrix.set(0, 0, "Hi");

for (ArrayList<String> list : matrix.getMatrix()) {
    for (String value : list) {
        System.out.print(value + "\t");
    }
    System.out.println();
}

我个人将使用ArrayListLinkedList但是如果您坚持使用array那么您可以做的是在分配值之前检查大小为nxm的数组是否已满。 如果已满,则创建一个新的多维数组,其大小为(n+1) x (m+1)并使用循环复制所有值。

该方法不是可取的,因为它会使用更多的资源,因为您需要在阵列满时重新创建和复制该阵列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM