簡體   English   中英

Java N 維數組

[英]Java N-Dimensional Arrays

我需要能夠有一個 n 維字段,其中 n 基於構造函數的輸入。 但我什至不確定這是否可能。 是嗎?

快速解決方案:您可以使用ArrayList的非泛型ArrayList來近似它...盡可能深入。 但是,這可能會很快使用起來很尷尬。

需要更多工作的替代方法可能是使用底層平面數組表示來實現您自己的類型,您可以在其中計算內部索引,並提供帶有可變參數的訪問器方法。 我不確定它是否完全可行,但可能值得一試......

粗略的示例(未經測試,沒有溢出檢查,錯誤處理等,但希望傳達基本思想):

class NDimensionalArray {
  private Object[] array; // internal representation of the N-dimensional array
  private int[] dimensions; // dimensions of the array
  private int[] multipliers; // used to calculate the index in the internal array

  NDimensionalArray(int... dimensions) {
    int arraySize = 1;

    multipliers = new int[dimensions.length];
    for (int idx = dimensions.length - 1; idx >= 0; idx--) {
      multipliers[idx] = arraySize;
      arraySize *= dimensions[idx];
    }
    array = new Object[arraySize];
    this.dimensions = dimensions;
  }
  ...
  public Object get(int... indices) {
    assert indices.length == dimensions.length;
    int internalIndex = 0;

    for (int idx = 0; idx < indices.length; idx++) {
      internalIndex += indices[idx] * multipliers[idx];
    }
    return array[internalIndex];
  }
  ...
}

這是一篇很好的文章,解釋了如何在運行時使用反射來創建數組: Java Reflection: Arrays 那篇文章解釋了如何創建一維數組,但是java.lang.reflect.Array還包含另一個newInstance方法來創建多維數組。 例如:

int[] dimensions = { 10, 10, 10 }; // 3-dimensional array, 10 elements per dimension
Object myArray = Array.newInstance(String.class, dimensions); // 3D array of strings

由於直到運行時才知道維數,因此只能將數組作為Object處理,並且必須使用Array類的getset方法來操作數組的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM