Tengo una clase - xClass, que quiero cargar en una matriz de xClass, entonces la declaración:
xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();
Sin embargo, no sé si necesitaré 10. Es posible que necesite 8 o 12 o cualquier otro número para el caso. No lo sabré hasta el tiempo de ejecución. ¿Puedo cambiar la cantidad de elementos en una matriz sobre la marcha? ¿Si es así, cómo?
Respuestas:
No, no puede cambiar el tamaño de una matriz una vez creada. Tiene que asignarlo más grande de lo que cree que necesitará o aceptar la sobrecarga de tener que reasignarlo para que crezca en tamaño. Cuando lo haga, tendrá que asignar uno nuevo y copiar los datos del antiguo al nuevo:
Si se encuentra en esta situación, le recomiendo encarecidamente utilizar las colecciones de Java. En particular,
ArrayList
esencialmente envuelve una matriz y se encarga de la lógica para hacer crecer la matriz según sea necesario:En general, an
ArrayList
es una solución preferible a una matriz de todos modos por varias razones. Por un lado, las matrices son mutables. Si tienes una clase que hace esto:ha creado un problema ya que una persona que llama puede cambiar su miembro de datos privados, lo que conduce a todo tipo de copias defensivas. Compare esto con la versión de la lista:
fuente
En java, la longitud de la matriz es fija.
Puede utilizar una lista para mantener los valores e invocar el
toArray
método si es necesario. Consulte el siguiente ejemplo:fuente
Como han dicho otros, no puede cambiar el tamaño de una matriz Java existente.
ArrayList es lo más cercano que tiene Java estándar a una matriz de tamaño dinámico. Sin embargo, hay algunas cosas sobre ArrayList (en realidad, la interfaz List) que no son "como una matriz". Por ejemplo:
[ ... ]
para indexar una lista. Tienes que usar los métodosget(int)
yset(int, E)
.set(15, foo)
.add
,insert
yremove
métodos.Si desea algo más parecido a una matriz, deberá diseñar su propia API. (Tal vez alguien podría intervenir con una biblioteca de terceros existente ... no pude encontrar una con 2 minutos de "investigación" usando Google :-))
Si solo necesita una matriz que crece a medida que la inicializa , entonces la solución es algo como esto.
fuente
Establece el número de elementos en cualquier cosa que desee en el momento de crearlo:
Luego, puede inicializar los elementos en un bucle. Supongo que esto es lo que necesitas.
Si necesita agregar o eliminar elementos a la matriz después de crearla, tendrá que usar un archivo
ArrayList
.fuente
Puede utilizar ArrayList:
...
fuente
Arrays.copyOf()
El método tiene muchas opciones para solucionar el problema con el aumento dinámico de la longitud de la matriz.API de Java
fuente
Sí, envuélvalo y use el marco de Colecciones.
Luego use List.toArray () cuando sea necesario, o simplemente itere sobre dicha List.
fuente
Como dicen otros usuarios, probablemente necesite una implementación de java.util.List.
Si, por alguna razón, finalmente necesita una matriz, puede hacer dos cosas:
Use una lista y luego conviértala en una matriz con myList.toArray ()
Utilice una matriz de cierto tamaño. Si necesita más o menos tamaño, puede modificarlo con los métodos java.util.Arrays.
La mejor solución dependerá de su problema;)
fuente
Recomiendo usar vectores en su lugar. Muy fácil de usar y tiene muchos métodos predefinidos de implementación.
para agregar un elemento simplemente use:
En (5,2), los primeros 5 son el tamaño inicial del vector. Si excede el tamaño inicial, el vector crecerá 2 lugares. Si vuelve a excederse, volverá a aumentar en 2 lugares y así sucesivamente.
fuente
Donde declara la matriz myclass [] como:
, simplemente pase como argumento el número de elementos XClass que necesitará. En ese momento, ¿sabe cuántos necesitará? Al declarar que la matriz tiene 10 elementos, no declara 10 objetos XClass, simplemente está creando una matriz con 10 elementos de tipo xClass.
fuente
Los tamaños de las matrices de Java son fijos. No se pueden crear matrices dinámicas como en C ++.
fuente
Es una buena práctica obtener la cantidad que necesita almacenar primero y luego inicializar la matriz.
por ejemplo, le preguntaría al usuario cuántos datos necesita almacenar y luego lo inicializaría, o consultaría el componente o argumento de cuántos necesita almacenar. Si desea una matriz dinámica, puede usar
ArrayList()
y usar laal.add();
función para seguir agregando, entonces puede transferirla a una matriz fija.hacerlo es redundante, pero sólo para mostrar la idea,
ArrayList
puede sostener objetos a diferencia de otros tipos de datos simples y son muy fáciles de manipular, la eliminación de cualquier cosa, desde el centro es fácil, así, por completo con dynamic.sameList
yStack
fuente
No sé si puede cambiar el tamaño en tiempo de ejecución, pero puede asignar el tamaño en tiempo de ejecución. Intente usar este código:
esto asigna el tamaño de su matriz para que sea el que se ingresó en el tiempo de ejecución en x.
fuente
Aquí hay un método que no usa ArrayList. El usuario especifica el tamaño y puede agregar un bucle do-while para la recursividad.
fuente
En Java, los tamaños de matriz son siempre de longitud fija, pero hay una forma en la que puede aumentar dinámicamente el tamaño de la matriz en tiempo de ejecución.
Esta es la forma más "utilizada" y preferida de hacerlo.
En el código anterior estamos inicializando una nueva matriz temp [], y además usamos un bucle for para inicializar el contenido de la temp con el contenido de la matriz original, es decir. stck []. Y luego copiarlo nuevamente al original, lo que nos da una nueva matriz de TAMAÑO nuevo.
Sin duda, genera una sobrecarga de CPU debido a la reinicialización de una matriz usando el bucle for repetidamente. Pero aún puede usarlo e implementarlo en su código. Para las mejores prácticas, use "Lista enlazada" en lugar de Array, si desea que los datos se almacenen dinámicamente en la memoria, de longitud variable.
Aquí hay un ejemplo en tiempo real basado en pilas dinámicas para AUMENTAR EL TAMAÑO DE LA ARRAY en tiempo de ejecución
Nombre de archivo: DStack.java
Nombre de archivo: Exec.java
(con la clase principal)
Espero que esto resuelva su consulta.
fuente
Sí, podemos hacerlo de esta manera.
fuente
Dado que ArrayList ocupa mucha memoria cuando necesito una matriz de tipos primitivos, prefiero usar IntStream.builder () para crear una matriz int (también puede usar los constructores LongStream y DoubleStream).
Ejemplo:
Nota: disponible desde Java 8.
fuente
Puedes hacer algo
fuente