2010-03-30 2 views
5

Voglio creare un array XY di interi (o qualsiasi tipo), ma voglio usare metodi come "add", "remove", "contains", "indexOf "simile alla classe ArrayList.Java: array bidimensionale con metodi/funzionalità simili a ArrayList

Esiste una classe esistente con queste funzionalità?

PS: io non voglio creare un ArrayList di ArrayList

+1

"Non voglio creare un ArrayList di ArrayList" Perché? In realtà corrisponderebbe perfettamente alla tua descrizione. È perché vuoi usare i tipi primitivi? – Searles

+0

No. È perché voglio creare oggetti che occuperanno più di una cella, e ognuno può essere verticale o orizzontale. Se consideriamo che ArrayList è verticale, avrei problemi con gli oggetti in orizzontale, dato che useranno varie posizioni di vari ArrayList contemporaneamente. –

risposta

3

No, AFAIK non esiste una classe come questa. Ma Implementazione di uno dovrebbe essere abbastanza facile:

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

Nota: La Typeparameter non viene utilizzato internamente, perché non v'è alcuna cosa come new T[][]

EDITS
Aggiunto Metodo addX per la dimostrazione
Errori di compilazione corretti

1

ci sono tipi di matrice nativi nelle librerie standard di Java. Detto questo, è abbastanza facile crearne uno. I metodi sono banali da implementare e puoi eseguirne il backup con un array, un List o qualsiasi altra cosa.

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

Cosa ti aspetti che 'remove' faccia effettivamente? (E vuoi controllare i tuoi argomenti?) –

+0

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

+1

I significa 'Matrix.remove'. In primo luogo, rimuove solo la prima concurrenza, il che significa che si dipende dal layout di implementazione. In secondo luogo, sposta le voci rimanenti in un modo simile a unMatrix, e fa sì che get get in modo strano. –

1

check out JAMA, proviene da Mathworks e NIST.

2

Dalla descrizione, ti suggerisco di provare a utilizzare JAMA.
È inoltre possibile creare la propria implementazione per una XY Matrix. Tuttavia, per fare ciò, dovrai decidere cosa esattamente desideri dall'implementazione.
Se la tua Matrix non ha una dimensione fissa, puoi usare qualcosa come il formato a 3 tuple per la memorizzazione delle matrici. (Questa rappresentazione è efficiente solo se la tua matrice è scarsa). Internamente, userete tre ArrayList; uno per la memorizzazione del numero di riga, il secondo per la memorizzazione del numero di colonna e il terzo per la memorizzazione del valore attuale.
Di conseguenza, si scriverà il metodo add(int row, int column, int value), che si prende cura di cose come mantenere le liste di array ordinate per numero di riga, poi per numero di colonna, ecc. Per aumentare l'efficienza degli accessi casuali.
Con questa rappresentazione, è possibile implementare tutti i metodi come remove(), , disponibili per ArrayList.