¿Cómo puedo agregar elementos dinámicamente a una matriz de Java?

85

En PHP, puede agregar elementos dinámicamente a las matrices de la siguiente manera:

$x = new Array();
$x[] = 1;
$x[] = 2;

Después de esto, $xsería una matriz de esta manera: {1,2}.

¿Hay alguna forma de hacer algo similar en Java?

kamikaze_pilot
fuente
4
Para todas las respuestas a continuación, usa ArrayList, pero OP solicita específicamente Array. Me gustaría saber también.
KJYe.Name 葉家仁
4
la respuesta es 'No'. Debe especificar el tamaño de la matriz (o completar todos los elementos) en el momento de la declaración / creación en Java. Consulte java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
Ritesh
Me di cuenta de que varias funciones de Java devuelven matrices, así que miré la implementación de la lista (filtro) en File.java. Utiliza una lista internamente y luego la convierte en una matriz al final. List <String> v = new ArrayList <> (); ... return v.toArray (new String [v.size ()]);
xtempore

Respuestas:

112

Mira java.util.LinkedList o java.util.ArrayList

List<Integer> x = new ArrayList<Integer>();
x.add(1);
x.add(2);
corsiKa
fuente
21
Esta es una respuesta perfecta excepto por una pieza. Normalmente en Java usamos List's en lugar de matrices primitivas, pero para los casos en los que realmente necesita una matriz primitiva (como int[]) simplemente use el toArray()método en List. Utilice el código anterior pero úselo x.toArray()para obtener una matriz primitiva.
rharter
1
En el 99% de los casos (más como el 99,99999% de los casos), si realmente necesita una matriz primitiva, está haciendo algo mal y debe manejarse con los principios OO. A menos que esté interactuando con código nativo, o algo como ARRAYobjetos de Oracle o alguna tontería como esa, es mucho mejor evitar las matrices primitivas.
corsiKa
11
oh, todos estos comentarios sobre cómo no deberías usar matrices primitivas, si solo fuera así de fácil :(
thecoshman
1
@trusktr Esa es una razón para hacerlo. En este ejemplo, es más en la línea de ... usar una Listreferencia nos permite patear ArrayListla acera en cualquier momento que queramos. Si alguien publica una lista mejor, como SuperDuperAwesomeList, podríamos tener mucho trabajo por hacer si hiciéramos nuestra referencia como ArrayList. ArrayList tiene cosas que List no tiene. Si confiamos en esas cosas en nuestro código, se vuelve mucho más difícil intercambiar.
corsiKa
1
@corsiKa, escribe algunos algoritmos de compresión / codificación sin primitivas y esos casos son mucho más comunes que 99. (9). Маtrix también implica gritar primitivs. Por otra parte, si interactúa con código nativo, usa DirectBuffers, no matrices primitivas. Al final, alguien tiene que ir al grano, si estás atascado con bases de datos y presentación, está bien, pero la declaración del 99% es simplemente una tontería.
bestsss
64

Las matrices en Java tienen un tamaño fijo, por lo que no puede "agregar algo al final" como podría hacer en PHP.

Un poco similar al comportamiento de PHP es este:

int[] addElement(int[] org, int added) {
    int[] result = Arrays.copyOf(org, org.length +1);
    result[org.length] = added;
    return result;
}

Entonces puedes escribir:

x = new int[0];
x = addElement(x, 1);
x = addElement(x, 2);

System.out.println(Arrays.toString(x));

Pero este esquema es terriblemente ineficaz para matrices más grandes , ya que hace una copia de toda la matriz cada vez. (Y de hecho, no es completamente equivalente a PHP, ya que sus antiguas matrices siguen siendo las mismas).

Las matrices PHP son de hecho bastante iguales a un Java HashMap con una "clave máxima" agregada, por lo que sabría qué clave usar a continuación y un extraño orden de iteración (y una extraña relación de equivalencia entre claves Integer y algunas cadenas). Pero para colecciones indexadas simples, es mejor usar una Lista en Java, como las otras respuestas propuestas.

Si quieres evitar usar List debido a la sobrecarga de envolver cada int en un Integer, considere usar reimplementaciones de colecciones para tipos primitivos, que usan matrices internamente, pero no harán una copia en cada cambio, solo cuando la matriz interna esté llena ( como ArrayList). (Un ejemplo rápidamente buscado en Google es esta clase IntList ).

Guayaba contiene métodos que crean tales envolturas en Ints.asList, Longs.asList, etc.

Paŭlo Ebermann
fuente
es mucho más inteligente que la solución aceptada. sin objetos desperdiciados.
niebla
2
@Mihail: En realidad, normalmente no recomiendo hacer esto, ya que por cada adición de un elemento se crea una nueva matriz y se copia todo el contenido. (Depende de su caso de uso, sin embargo, si rara vez agrega / elimina algo, y con frecuencia itera / busca, podría estar bien).
Paŭlo Ebermann
ArrayUtils en las versiones más nuevas tiene un método que hace eso. Soy bastante vago para comprobar la implementación, pero estoy bastante seguro de que lo han escrito bien.
niebla
1
@MihailStoynov En realidad, esto es esencialmente lo que ArrayListhace, excepto que en lugar de cambiar el tamaño en cada adición, cuando se queda sin espacio, duplica su tamaño para que no tenga que cambiar de tamaño tan a menudo.
corsiKa
1
@Mav No, porque orges uno más corto que result.
Paŭlo Ebermann
19

Apache Commons tiene una implementación ArrayUtils para agregar un elemento al final de la nueva matriz:

/** Copies the given array and adds the given element at the end of the new array. */
public static <T> T[] add(T[] array, T element)
niebla
fuente
2
En el ArrayUtils más reciente es: ArrayUtils.appendElement (String.class, origArray, "nuevo elemento")
marmor
12

He visto esta pregunta con mucha frecuencia en la web y, en mi opinión, muchas personas con alta reputación no respondieron estas preguntas correctamente. Así que me gustaría expresar mi propia respuesta aquí.

Primero debemos considerar que hay una diferencia entre arrayy arraylist.

La pregunta pide agregar un elemento a una matriz. , y no ArrayList


La respuesta es bastante simple. Se puede realizar en 3 pasos.

  1. Convertir matriz en una lista de matrices
  2. Agregar elemento a arrayList
  3. Convierta de nuevo la nueva lista de matrices en la matriz

Aquí está la imagen simple ingrese la descripción de la imagen aquí

Y finalmente aquí está el código:

Paso 1:

public List<String> convertArrayToList(String[] array){
        List<String> stringList = new ArrayList<String>(Arrays.asList(array));
        return stringList;
    }

Paso 2:

public  List<String> addToList(String element,List<String> list){

            list.add(element);
            return list;
    }

Paso 3:

public String[] convertListToArray(List<String> list){
           String[] ins = (String[])list.toArray(new String[list.size()]);
           return ins;
    } 

Paso 4

public String[] addNewItemToArray(String element,String [] array){
        List<String> list = convertArrayToList(array);
        list= addToList(element,list);
        return  convertListToArray(list);
}
Palanqueta
fuente
1
Voto a favor porque finalmente alguien mencionó la diferencia entre una matriz real y ArrayList ...
JoeG
Respuesta más completa y descriptiva.
Obaid
11

Puede usar un ArrayListy luego usar el toArray()método. Pero dependiendo de lo que esté haciendo, es posible que ni siquiera necesite una matriz. Mire para ver si Listses más lo que quiere.

Ver: Tutorial de lista de Java

Ian Dallas
fuente
5

Probablemente desee usar una ArrayList para esto, para una estructura similar a una matriz de tamaño dinámico.

Aerodeslizador lleno de anguilas
fuente
4

Puede agregar elementos dinámicamente a una matriz utilizando Collection Frameworks en JAVA. Collection Framework no funciona en tipos de datos primitivos.

Este marco de la colección estará disponible en el paquete "java.util. *"

Por ejemplo, si usa ArrayList,

Cree un objeto y luego agregue una cantidad de elementos (cualquier tipo como String, Integer ... etc.)

ArrayList a = new ArrayList();
a.add("suman");
a.add(new Integer(3));
a.add("gurram");

Ahora se le agregaron 3 elementos a una matriz.

si desea eliminar alguno de los elementos agregados

a.remove("suman");

de nuevo si quieres agregar cualquier elemento

a.add("Gurram");

Entonces, el tamaño de la matriz aumenta / disminuye dinámicamente.

SSSM
fuente
1

Utilice una ArrayList o haga malabares con las matrices para incrementar automáticamente el tamaño de la matriz.

Ibrahim AshShohail
fuente
0

Mantenga un recuento de dónde se encuentra en la matriz primitiva

class recordStuff extends Thread
{
    double[] aListOfDoubles;
    int i = 0;

    void run()
    {
        double newData;
        newData = getNewData(); // gets data from somewhere

        aListofDoubles[i] = newData; // adds it to the primitive array of doubles
        i++ // increments the counter for the next pass

        System.out.println("mode: " + doStuff());
    }

    void doStuff()
    {
        // Calculate the mode of the double[] array

        for (int i = 0; i < aListOfDoubles.length; i++) 
        {
            int count = 0;
            for (int j = 0; j < aListOfDoubles.length; j++)
            {
                if (a[j] == a[i]) count++;
            }
            if (count > maxCount) 
            {
                maxCount = count;
                maxValue = aListOfDoubles[i];
            }
        }
        return maxValue;
    }
}

fuente
Esto realmente no tiene nada que ver con la pregunta original de si es posible agregar dinámicamente nuevos elementos a una matriz primitiva de Java.
Joe Day
0

Esta es una forma sencilla de agregar a una matriz en java. Usé una segunda matriz para almacenar mi matriz original y luego le agregué un elemento más. Después de eso, pasé esa matriz a la original.

    int [] test = {12,22,33};
    int [] test2= new int[test.length+1];
    int m=5;int mz=0;
    for ( int test3: test)        
    {          
    test2[mz]=test3; mz++;        
    } 
    test2[mz++]=m;
    test=test2;

    for ( int test3: test)

    {
      System.out.println(test3);
    }
Nenad Bojović
fuente
0

En Java, el tamaño de la matriz es fijo, pero puede agregar elementos dinámicamente a una matriz de tamaño fijo usando su índice y bucle for. Encuentre un ejemplo a continuación.

package simplejava;

import java.util.Arrays;

/**
 *
 * @author sashant
 */
public class SimpleJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        try{
            String[] transactions;
            transactions = new String[10];

            for(int i = 0; i < transactions.length; i++){
                transactions[i] = "transaction - "+Integer.toString(i);            
            }

            System.out.println(Arrays.toString(transactions));

        }catch(Exception exc){
            System.out.println(exc.getMessage());
            System.out.println(Arrays.toString(exc.getStackTrace()));
        }
    }

}
Sashant Pardeshi
fuente