它是重复局部变量问题的优雅解决方案吗?

时间:2010-12-03 11:02:47

标签: java variables duplicates local-variables

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

ADDED

我想用这段代码做什么?我需要填充(填写)名为exchanges的列表。列表的第一个元素是lastExchange。我的代码问题是我总是需要创建一个变量的两个副本(这就是为什么我认为代码不优雅但我找不到更好的解决方案)。例如,在一开始我创建lastExchange,然后创建exchangeToAdd(与lastExchange具有相同的值)。循环中也是如此。我创建lastExchange,然后创建exchangeToAddForLoop。我这样做是因为我无法将lastExchange添加到列表中,因为它将在后面进行修改。

已添加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之外,我还需要计算e2e

3 个答案:

答案 0 :(得分:4)

至少在两个方面,这是不优雅的代码:

  • 您的大多数局部变量都被分配了值,然后立即被覆盖
  • 您的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);
}

接下来,我们遇到的问题是,您没有告诉我们这些代码是做什么的,也不是“重复的局部变量问题”。哦,正如评论中指出的那样,你的循环永远不会终止。

答案 1 :(得分:3)

在不讨论代码的情况下,当您有重复的变量错误时,您始终可以使用{}。

这不编译

            int a=0;
            a++;


            int a=0;
            a++;

这样做:

        {
            int a=0;
            a++;
        }
        {
            int a=0;
            a++;
        }

答案 2 :(得分:2)

@ Jon的简化是最安全的,但我怀疑它可以进一步简化。

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