簡體   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