2010-03-30 19 views
5

Quiero crear una matriz XY de enteros (o del tipo que sea), pero quiero usar métodos como "agregar", "eliminar", "contiene", "indexOf" "similar a la clase ArrayList.Java: matriz bidimensional con métodos/capacidades similares a ArrayList

¿Existe alguna clase con estas capacidades?

PD: No quiero crear un ArrayList de ArrayList

+1

"No quiero crear una ArrayList de ArrayList" ¿Por qué? En realidad se ajustaría perfectamente a tu descripción. ¿Es porque quieres usar tipos primitivos? – Searles

+0

No. Es porque quiero crear objetos que ocupen más de una celda, y cada uno puede ser vertical u horizontalmente. Si consideramos que ArrayList es vertical, tendría problemas con los objetos horizontalmente, ya que usarán varias posiciones de varios ArrayLists a la vez. –

Respuesta

3

No, AFAIK no hay ninguna clase como esta. Pero la implementación de uno debería ser bastante fácil:

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: El Typeparameter no se usa internamente, porque no hay tal cosa como new T[][]

EDITS
Agregado ADDX Método para la demostración
Corrección de errores de compilación

1

No hay ningún tipo de matriz nativas en las bibliotecas estándar de Java. Dicho esto, es bastante fácil crear uno. Los métodos son triviales de implementar y puedes respaldarlos con una matriz, List o lo que sea.

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

¿Qué esperas que 'remove' haga realmente? (¿Y desea verificar sus argumentos?) –

+0

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

+1

I significa 'Matrix.remove'. En primer lugar, solo elimina la primera concurrencia, lo que significa que depende del diseño de la implementación. En segundo lugar, cambia las entradas restantes de una manera que no es similar a Matriz, y hace que 'get' se lance de forma extraña. –

1

echa un vistazo a JAMA, es de Mathworks y NIST.

2

De su descripción, le sugiero que pruebe a utilizar JAMA.
También puede crear su propia implementación para una Matriz XY. Sin embargo, para hacer esto, deberá decidir exactamente qué desea de la implementación.
Si su matriz no es de tamaño fijo, entonces puede usar algo como el formato de 3 tuplas para almacenar matrices. (Esta representación es eficiente solo si su matriz es escasa). Internamente, usará tres ArrayLists; uno para almacenar el número de fila, el segundo para almacenar el número de columna y el tercero para almacenar el valor real.
En consecuencia, escribirá el método add(int row, int column, int value), que se ocupa de cosas como mantener los ArrayLists ordenados por número de fila, luego por número de columna, etc. para aumentar la eficiencia de los accesos aleatorios.
Con esta representación, puede implementar todos los métodos como remove(), , que están disponibles para ArrayList.

Cuestiones relacionadas