【问题标题】:Dynamic two dimensional array动态二维数组
【发布时间】:2015-05-28 13:51:06
【问题描述】:

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

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

【问题讨论】:

  • 那么 List> 呢?即列表列表
  • 你为什么不使用 List of List 的?而不是尝试动态更改行数和列数。

标签: java multidimensional-array


【解决方案1】:

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

尝试使用列表列表。

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){
        ...
    }
}

【讨论】:

  • 感谢我如何使用 for 循环和迭代器遍历所有元素?
【解决方案2】:

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

2 dimensional array list

【讨论】:

    【解决方案3】:

    尝试使用类似的东西。

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      所以你可以在技术上做同样的事情。每次需要更大尺寸的数组时:

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

      【讨论】:

        【解决方案5】:

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

        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();
        }
        

        【讨论】:

          【解决方案6】:

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

          这种方法并不可取,因为它使用更多的资源,因为每次数组满时都需要重新创建和复制。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-03
            • 2017-07-06
            • 2014-06-03
            • 2016-08-07
            • 2021-10-08
            • 2016-03-18
            • 2013-02-22
            • 2011-08-14
            相关资源
            最近更新 更多