Java: Array bidimensional com métodos/recursos semelhantes ao ArrayList
-
23-09-2019 - |
Pergunta
Quero criar uma matriz XY de números inteiros (ou qualquer tipo de tipo), mas quero usar métodos como "Adicionar", "Remover", "contém", "indexof" semelhante à classe ArrayList.
Existe alguma classe existente com esses recursos?
PS: Eu não quero criar um ArrayList of ArrayList
Solução
Não, Afaik não há nenhuma aula como essa. Mas implementar um deve 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: o typeParameter não é usado internamente, porque não existe new T[][]
EDITAR% S
Método Addx adicionado para demonstração
Erros de compilação fixa
Outras dicas
Pela sua descrição, sugiro que você tente usar o JAMA.
Você também pode criar sua própria implementação para uma matriz XY. No entanto, para fazer isso, você terá que decidir o que exatamente deseja da implementação.
Se sua matriz não for de tamanho fixo, você poderá usar algo como o formato de 3 tuple para armazenar matrizes. (Essa representação é eficiente apenas se sua matriz for escassa). Internamente, você usará três Arraylists; Um para armazenar o número da linha, segundo para armazenar o número da coluna e o terceiro para armazenar o valor real.
Consequentemente, você escreverá o add(int row, int column, int value)
Método, que cuida de coisas como manter as listas de array classificadas pelo número da linha, depois pelo número da coluna, etc. para aumentar a eficiência dos acessos aleatórios.
Com esta representação, você pode implementar todos os métodos como remove()
, contains()
, que estão disponíveis para a ArrayList.
Não há tipos de matriz nativos nas bibliotecas Java padrão. Dito isto, é bastante fácil criar um. Os métodos são triviais de implementar e você pode apoiá -lo com uma matriz, um List
como queiras.
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
}
Verificação de saída Jama, é do Mathworks e Nist.