Java: Array bidimensionale con metodi / funzionalità simili a ArrayList
-
23-09-2019 - |
Domanda
Voglio creare una matrice XY di interi (o qualsiasi tipo), ma voglio usare metodi come "add", "rimuovi", "contiene", "indexOf" simile a ArrayList classe.
C'è qualche classe esistente con queste capacità?
PS: io non voglio creare un ArrayList di ArrayList
Soluzione
No, per quanto ne so non c'è alcuna classe come questa. Ma implementazione 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
Fissi compilazione errori
Altri suggerimenti
Dalla tua descrizione, vorrei suggerire di provare a utilizzare JAMA.
È inoltre possibile creare una propria implementazione di un XY Matrix. Tuttavia, per fare questo, si dovrà decidere che cosa esattamente si vuole dall'implementazione.
Se la matrice non è di dimensione fissa, quindi è possibile utilizzare qualcosa come il formato 3-tuple per la memorizzazione di matrici. (Questa rappresentazione è efficiente solo se la matrice è sparsa). Internamente, si utilizzerà tre ArrayLists; uno per memorizzare il numero di riga, secondo per memorizzare il numero della colonna e il terzo per la memorizzazione del valore effettivo.
Di conseguenza, si scriverà il metodo add(int row, int column, int value)
, che si occupa di cose come tenere i ArrayLists ordinati secondo il numero di riga, quindi in base al numero di colonna, ecc per aumentare l'efficienza di accessi casuali.
Con questa rappresentazione, è possibile implementare tutti i metodi come remove()
, contains()
, che sono disponibili per ArrayList.
Non ci sono tipi di matrice nativi nelle librerie standard di Java. Detto questo, è abbastanza facile per crearne uno. I metodi sono banali da implementare e si può eseguire con una matrice, 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
}
JAMA , è da The MathWorks e NIST.