2010-03-30 44 views
5

我想創建一個整數(或任何類型)的XY數組,但我想使用像「add」,「remove」,「contains」,「indexOf 「類似於ArrayList類。Java:具有與ArrayList相似的方法/功能的二維數組

是否有任何現有的類具有這些功能?

PS:我不希望創建的ArrayList的ArrayList

+1

「我不想創建ArrayList的ArrayList」爲什麼?它實際上完全適合你的描述。是否因爲你想使用原始類型? – Searles 2010-03-30 02:36:37

+0

不是。這是因爲我想創建佔據多個單元格的對象,並且每個對象可以是垂直的也可以是水平的。 如果我們認爲ArrayList是垂直的,那麼我會在水平方向上遇到問題,因爲它們會一次使用varios ArrayLists的各種位置。 – 2010-04-13 19:48:02

回答

3

不,AFAIK沒有這樣的課。但實現一個應該是相當容易:

class BiDimensionalArray<T>{ 
    Object[][] backupArray; 
    int lengthX; 
    int lengthY; 

    public BiDimensionalArray(int lengthX, int lengthY) { 
    backupArray = new Object[lengthX][lengthY]; 
    this.lengthX = lengthX; 
    this.lengthY = lengthY; 
    } 

    public void set(int x, int y, T value){ 
    backupArray[x][y] = value; 
    } 

    public T get(int x, int y){ 
    return (T) backupArray[x][y]; 
    } 

    public void addX(T[] valuesY) { 
    Object[][] newArray = new Object[lengthX+1][lengthY]; 
    System.arraycopy(backupArray, 0, newArray, 0, lengthX); 
    newArray[lengthX]=valuesY; 
    backupArray = newArray; 
    lengthX = lengthX+1; 
    } 
} 

注:Typeparameter沒有在內部使用,因爲作爲new T[][]

沒有這樣的事編輯
新增ADDX方法示範
固定編譯錯誤

1

有標準Java庫沒有本地矩陣類型。這就是說,創建一個相當容易。這些方法實施起來並不重要,你可以用一個數組,List或其他來支持它。

public class Matrix<T> { 
    private final List<T> values; 
    private final int rows; 

    public Matrix(int x, int y) { 
    this.rows = x; 
    values = new ArrayList<T>(x * y); 
    ] 

    public int get(int x, int y) { 
    return values.get(x * rows + y); 
    } 

    public boolean contains(T t) { 
    return values.contains(t); 
    } 

    // etc 
} 
+0

你期待'remove'實際上做什麼? (你想檢查你的論點嗎?) – 2010-03-30 03:48:25

+0

@Tom http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object) – cletus 2010-03-30 04:14:04

+1

I意味着'Matrix.remove'。首先,它只消除了第一次同意,這意味着您依賴於實現佈局。其次,它會像其他方式一樣將剩餘的條目轉移到一個非常不方便的矩陣中,並導致'get'拋出奇怪。 – 2010-03-30 10:17:06

1

檢出JAMA,它來自Mathworks和NIST。

2

從你的描述中,我建議你嘗試使用JAMA。
您也可以爲XY矩陣創建自己的實現。但是,爲了做到這一點,您必須決定從實現中究竟需要什麼。
如果您的矩陣不是固定大小,那麼您可以使用類似3元組格式的內容來存儲矩陣。 (只有矩陣稀疏時,此表示纔有效)。在內部,您將使用三個ArrayLists;一個用於存儲行號,第二個用於存儲列號,第三個用於存儲實際值。
因此,您將編寫add(int row, int column, int value)方法,該方法負責保留ArrayLists按行號排序,然後按列號等方式來提高隨機訪問的效率。
使用此表示法,您可以實現所有可用於ArrayList的方法,如remove(),。