Это элегантное решение проблемы дублирующихся локальных переменных? - PullRequest
0 голосов
/ 03 декабря 2010
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);
}

ДОБАВЛЕНО

Что я пытаюсь сделать с этим кодом?Мне нужно заполнить (заполнить) список под названием exchanges.Первый элемент списка - lastExchange.Моя проблема с кодом заключается в том, что мне всегда нужно создавать два дубликата переменной (поэтому я считаю, что код не элегантный, но не могу найти лучшего решения).Например, в самом начале я создаю lastExchange, а затем создаю exchangeToAdd (имеет то же значение, что и lastExchange).То же самое происходит в цикле.Я создаю lastExchange, а затем я создаю exchangeToAddForLoop.Я делаю это потому, что не могу добавить lastExchange в список, потому что он будет изменен последним.

ADDED 2

Вот моя проблемаУ меня есть такой код:

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.
}

, и мне нужно вычислить e1 и e2 дополнительно к вычислению e.

Ответы [ 3 ]

4 голосов
/ 03 декабря 2010

Это не элегантный код, по крайней мере, двумя способами:

  • Большинству ваших локальных переменных присваиваются значения, которые затем немедленно перезаписываются
  • Ваша переменная newExchange может быть объявлена ​​более глубоко вложенной.

Итак, без изменения поведения, вот более приятная версия:

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);
}

Далее мы подходим к проблеме, которая заключается в том, что вы не сказали нам, что должен делать какой-либо из этого кода, или что вы подразумеваете под «проблемой дублирующихся локальных переменных». О, и, как указано в комментариях, ваш цикл никогда не заканчивается.

3 голосов
/ 03 декабря 2010

Без обсуждения вашего кода, если у вас есть дублирующиеся переменные ошибки, вы всегда можете использовать {}.

. Это не компилируется

2 голосов
/ 03 декабря 2010

@ Упрощение Джона самое безопасное, однако я подозреваю, что его можно упростить и дальше.

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());
}
...