Es una solución elegante del duplicado del problema variable local?
-
30-09-2019 - |
Pregunta
Integer[] lastExchange = new Integer[nColors];
Integer[] exchangeToAdd = new Integer[nColors];
lastExchange = getValue();
exchangeToAdd = getValue();
exchanges.add(exchangeToAdd);
Integer[] newExchange = new Integer[nColors];
while (true) {
newExchange = getValue(lastExchange);
Integer[] exchangeToAddForLoop = new Integer[nColors];
for (int i=0; i<nColors; i++) {
lastExchange[i] = newExchange[i];
exchangeToAddForLoop[i] = newExchange[i];
}
exchanges.add(exchangeToAddForLoop);
}
AÑADIDO
Lo que estoy tratando de hacer con este código? Necesito para poblar (rellenar) la lista llamada exchanges
. El primer elemento de la lista es lastExchange
. Mi problema con el código es que siempre que crear dos duplicados de una variable (es por eso que creo que el código no es elegante, pero no puedo encontrar una solución mejor). Por ejemplo, en el principio creo lastExchange
y luego crear exchangeToAdd
(que tiene el mismo valor que lastExchange
). Lo mismo sucede en el bucle. Creo lastExchange
y luego creo exchangeToAddForLoop
. Lo hago porque no puedo añadir a la lista lastExchange
porque va a ser modificado este último.
AÑADIDO 2
Aquí está mi problema. Tengo el código de esa manera:
Integer[] e = getValue();
Integer[] e1 = getValue(); // <-- I do not like that.
exchanges.add(e1); // <-- I do not like that.
while (true) {
Integer[] e_new = getValue(e);
Integer[] e2 = new Integer[nColors]; // <-- I do not like that.
for (int i=0; i<nColors; i++) {
e[i] = e_new[i];
e2[i] = e_new[i]; // <-- I do not like that.
}
exchanges.add(e2); // <-- I do not like that.
}
y necesito e1
calcular y e2
adicionalmente al cálculo de e
.
Solución
Este es el código poco elegante en por lo menos dos maneras:
- La mayor parte de sus variables locales están siendo asignados los valores que son inmediatamente sobrescritos
- La variable de
newExchange
podría ser declarado más profundamente anidado.
Así que sin cambiar cualquier comportamiento, aquí está una versión más agradable:
Integer[] lastExchange = getValue();
Integer[] exchangeToAdd = getValue();
exchanges.add(exchangeToAdd);
while (true) {
Integer[] newExchange = getValue(lastExchange);
Integer[] exchangeToAddForLoop = new Integer[nColors];
for (int i=0; i<nColors; i++) {
lastExchange[i] = newExchange[i];
exchangeToAddForLoop[i] = newExchange[i];
}
exchanges.add(exchangeToAddForLoop);
}
A continuación llegamos al problema de que no nos ha dicho lo que cualquiera de este código está destinado a hacer, ni qué quiere decir con "el problema duplicado variable local". Ah, y tan fuera de punta en los comentarios, el bucle nunca se termina.
Otros consejos
Sin discutir su código, cuando se tiene errores variables duplicados, siempre se puede utilizar {}.
Esto no compila
int a=0;
a++;
int a=0;
a++;
esto hace:
{
int a=0;
a++;
}
{
int a=0;
a++;
}
@ simplificación de Jon es el más seguro, sin embargo sospecho que se puede simplificar aún más.
exchanges.add(getValue());
while (true) { // forever??
// do you need null values or can you use int[]
int[] newExchange = getValue(exchanges.get(exchanges.size()-1);
// do you need to add a copy, if not then clone() can be dropped.
exchanges.add(newExchange.clone());
}