Quiero utilizar una colección en lugar de una matriz 2D para no tener que dar su tamaño en el momento de la declaración y puedo agregar tantos elementos como quiera dinámicamente.¿Qué colección utilizar en lugar de matriz 2D en Java?
Respuesta
El problema con List> es que debe redimensionar cada fila si desea redimensionar su matriz.
Si desea utilizar una matriz dispersa, o tal vez una matriz infinita se puede hacer algo como:
class SparseMatrix<X> {
private Map<Coord, X> values = new HashMap<Coord, X>();
public SparseMatrix() {
}
public X get(int x, int y) {
return values.put(new Coord(x,y)); // null if there's no value
}
public void set(int x, int y, X value) { // you can use null (like in a List)
values.set(new Coord(x,y), value);
}
private static class Coord {
int x; int y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object other) {
if (other instance of Coord) {
Coord o = (Coord) other;
return o.x == x && o.y == y;
}
return false;
}
@Override
public int hashCode() {
return o.x + o.y; // or some more clever implementation :)
}
}
}
Editar:Apache Commons HashCodeBuilder es una gran herramienta para generar códigos hash.
Su hashCode puede desbordarse, sin embargo * usted * lo ha comentado en consecuencia ... :) – Esko
Vista nítida !!! Hay un método de utilidad: java.util.Arrays.hashCode (int []) que crea un código hash para int [] pero, por supuesto, no sería bueno crear una matriz cada vez que se necesita hashChode (o tener creó). Tal vez podríamos copiar su implementación solo para dos enteros: (31 + o.x) * 31 + o.y. Pero parece desbordarse de todos modos ... (Creo que no importa, ¿es cíclico?). – helios
¿Importa en el hashCode() que x + y == y + x? – Adam
Personalmente estoy usando la clase Vector para ese propósito, aunque diferentes requisitos pueden eventualmente dictar el uso de otras clases más especializadas.
El vector está prácticamente obsoleto y ha sido reemplazado por ArrayList. – Yoni
@mortiz - 'java.util.Vector' generalmente se debe evitar: su seguridad de subprocesos no es muy útil para la mayoría de los escenarios de subprocesos múltiples y solo agrega sobrecarga al uso de subprocesos únicos. La mayoría de las personas usan 'ArrayList' como su tipo' List' predeterminado en su lugar. – McDowell
aprendí algo, gracias! – moritz
java.util.ArrayList es mi elección preferida.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
Creo que se usa cuando queremos tener una matriz 1-D dinámica –
Puede tener una ArrayList que cada uno de sus elementos sería otra ArrayList (como lo proponemos rsp y yo en nuestras respuestas). De esta forma, una ArrayList también se puede usar para matrices 2D. – Alex
importación java.util.ArrayList;
ArrayList
es lo que desea, no es necesario para establecer su tamaño en tiempo de creación y se puede añadir elementos de forma dinámica utilizando el método add
.
La forma más sencilla es utilizar colecciones anidadas ... digamos (suponiendo que sus valores son cadenas) List<List<String>>
que luego pueden ser utilizados como esto:
List<List<String>> fakeArray = new ArrayList<List<String>>();
// Pretend you fill it with values between these calls
String retrieve = fakeArray.get(0).get(0);
Editar: Este fue originalmente un Map<String,List<String>>
lo que realmente doesn' tiene sentido en este contexto.
Sin embargo, es posible que desee ver si Google Collections o Apache Commons Collections tienen algo más especializado que puede utilizar.
Depende de lo que intente hacer, pero yo recomendaría ArrayList. Es más rápido que Vector. ¡A menos que te importe la sincronización! Si lo quiere como una lista bidimensional, crea una ArrayList y cada elemento de esta lista sería otra ArrayList.
Podría hacer una prueba con ArrayList
teniendo ArrayList
s como elementos. Si eso no hace lo que quieres, te dará instinto en lo que necesitas para construirte.
¿Qué quieres que se haga con él? Probablemente usaría simplemente un Collection<Collection<Element>>
(donde Collection podría ser reemplazado por List).
O puede crear su propia clase con métodos para iterar sobre filas o columnas o todos los elementos según sea necesario.
Depende de la forma en que desee utilizar la estructura de datos. Sus opciones son:
- Dos listas; es tu trabajo sincronizar entre ellos.
- Un mapa; en lugar de una relación clave-valor, las entradas de su mapa simplemente serán tuplas de objetos.
- Una lista de matrices de objetos de 2 celdas; cada elemento de la lista será una matriz objeto de tamaño 2.
EDIT: I leído mal completamente la pregunta; Pensé que se trataba de una matriz 2D de ancho 2.
Después de haber leído correctamente la pregunta (espero :-)), estoy de acuerdo con los que dijeron lista de listas.
- 1. Pregunta de matriz 2D Java
- 2. copiar una matriz 2D en Java
- 3. Buscando 'burbujas' en una matriz 2D de caracteres en Java
- 4. ¿Por qué es preferible utilizar listas en lugar de matrices en Java?
- 5. 2D matriz de objetos en Python
- 6. Algoritmo de Dijkstra para matriz 2D en Java
- 7. Inicializando matriz 2D en Python
- 8. ¿Por qué utilizar jQuery en() en lugar de clic()
- 9. por qué utilizar StringBuffer en Java en lugar del operador de concatenación de cadenas
- 10. null puntero excepción cadena 2d matriz en java
- 11. Cuándo utilizar EventListenerList en lugar de una colección general de oyentes
- 12. F # Crear matriz 2D
- 13. Programación de una grilla 2D en Java
- 14. Imprimir una matriz 2D en C
- 15. Contruir matriz 3D en numpy desde la matriz 2d existente
- 16. ¿Por qué utilizar campos en lugar de propiedades?
- 17. ¿Por qué utilizar un singleton en lugar de métodos estáticos?
- 18. ¿Por qué utilizar TagBuilder en lugar de StringBuilder?
- 19. ¿Por qué utilizar singleton en lugar de clase estática?
- 20. ¿Por qué utilizar una oreja en lugar de una guerra?
- 21. ¿Por qué utilizar JOIN en lugar de consultas internas
- 22. ¿Por qué utilizar EventArgs.Empty en lugar de null?
- 23. ¿Por qué debería utilizar el servicio de Android en lugar de hilo de Java
- 24. ¿Por qué guava Multimap.values () devuelve una colección plana en lugar de una colección de colecciones?
- 25. Implementando Polygon2D en Java 2D
- 26. Agrupación de matriz numpy 2D en promedio
- 27. Transponer una matriz 2D
- 28. Cuándo utilizar Helpers en lugar de Partials
- 29. ¿Qué es una colección java?
- 30. Obtener la longitud de la matriz de una matriz 2D en Java
¿Qué patrones va a utilizar para acceder a los elementos en la matriz? Acceso aleatorio, una fila completa, una columna completa? –