Pregunta

Tengo un bucle en el que puedo calcular un valor y agregue una lista. Por lo tanto, hago algo así:

x = getValue()
values.add(x)
while (true) {
   x = getValue();
   values.add(x)
}

Me di cuenta de que este enfoque no funciona ya que agrego la misma instancia de la lista. En más detalles, en cada ciclo del bucle que volver a asignar un nuevo valor a la x y haciendo así que cambio los valores de todos los elementos que ya se han añadido a la lista (así que al final me sale una lista de elementos idénticos).

Para resolver este problema hice lo siguiente:

x = getValue();
Integer[] valueToAdd = new Integer[n];
for (int i=0; i<n; i++) {
   valueToAdd[i] = x[i];
}
while (true) {
   x = getValue();
   y = new Integer[n];
   for (int i=0; i<n; i++) {
      valueToAdd[i] = x[i];
   }
   values.add(valueToAdd)
}

De este modo quería crear una nueva instancia cada vez que desee añadir un valor a la lista. Pero no funciona desde que sale un error de variable local duplicado.

También es extraño para mí que no tengo este error si declaro la misma variable muchas veces en el bucle. El problema aparece sólo si primero declarar una nueva variable fuera del bucle y luego también en el bucle.

¿Hay una manera de Java para volver a utilizar el mismo nombre para diferentes casos?

AÑADIDO Tengo que aclarar algunas cuestiones. No mostré todo el código. Tengo el comando break en el bucle (cuando un nuevo valor no se puede generar, yo salir del bucle). x y value tienen Integer[] tipo.

AÑADIDO 2 Dado que se mencionó que el problema puede estar en el getValue() necesito en más detalles aquí. En realidad no tengo getValue() en mi código (I utilizado getValue() aquí para hacer mi ejemplo más corto). En mi código que tenía:

   Integer[] x = new x[n];
    while (true) {
       for (int i=0; i<n; i++) {
          x[i] = y[i];
       }
       values.add(x)
    }

Y no funcionó ya que en mi lista values que tenía elementos idénticos (y sé que en el bucle en cada ciclo de x tenía un valor nuevo).

AÑADIDO 3

Por qué todos los elementos de mi lista parece a ser la misma?

¿Fue útil?

Solución

Su problema no es lo que usted piensa que es. Por ejemplo echar un vistazo a este sencillo programa:

String x = null;
List<String> l = new ArrayList<String>();
for (int i = 0; i < 10; i ++) {
    x = String.valueOf(i);
    l.add(x);
}

System.out.println(l);

Se imprime los números del 0 al 9. Esto se debe a java es pase por valor ( marque aquí ). No está de paso la referencia a x, está de paso el valor de x (en el método add).

Así que el problema radica en el método getValue(), que devuelve el mismo objeto.

Actualización: Ahora la pregunta tiene más sentido. Se está trabajando con el mismo objeto cada vez que x, y simplemente cambiando su estado. Con el fin de poner diferentes valores basta con mover la declaración dentro del bucle:

while (true) {
   Integer[] x = new x[n];
   ...
}

Si lo necesita fuera del bucle, así, sólo tiene que utilizar otra variable allí. No tiene por qué ser identificado x. Puesto que no se va a utilizar dentro del bucle de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top