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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top