在java中添加到循环内的列表的问题

时间:2010-11-30 07:25:58

标签: java

我编写了一个代码来检查数组是否不在列表中,然后它应该将它添加到另一个列表中。我使用了一个链表。但我的问题是程序总是添加当前数组的多个副本并删除列表中的内容:我的代码如下:

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Trial{

    public static void main(final String[] args){

        final List<int[]> G = new LinkedList<int[]>();
        final List<int[]> New = new LinkedList<int[]>();

        final int[] f = new int[2];

        for(int i = 0; i < 2; i++){
            for(int j = 0; j < 2; j++){
                f[0] = i;
                f[1] = j;
                // System.out.println("f is "+Arrays.toString(f));
                if(!(G.contains(f))){
                    System.out.println("current f is " + Arrays.toString(f));
                    // I print here in order to see what is f
                    New.add(f);
                    System.out.println("content of the list New");
                    // I print the list New to see its contents
                    for(int k = 0; k < New.size(); k++){
                        System.out.println(Arrays.toString(New.get(k)));
                    }
                    System.out.println("finished printing the list New");
                }
            }
        }

    }

}

这是我跑完后得到的结果:

current f is [0, 0]
content of the list New
[0, 0]
finished printing the list New
current f is [0, 1]
content of the list New
[0, 1]
[0, 1]
finished printing the list New
current f is [1, 0]
content of the list New
[1, 0]
[1, 0]
[1, 0]
finished printing the list New
current f is [1, 1]
content of the list New
[1, 1]
[1, 1]
[1, 1]
[1, 1]
finished printing the list New

请帮忙!!!!

3 个答案:

答案 0 :(得分:3)

如果我没有弄错,这是Java中的经典错误

你没有创造新物品!所以你总是在最后添加和修改同一个自我,你的列表一遍又一遍地包含一个1个对象。

你想要移动

int [] f = new int [2];

进入你的for循环

答案 1 :(得分:2)

它不会添加多个副本,它总是在第一次迭代后将f添加为新的列表项,然后f,f,f,f,f,f,然后是列表中的f,f,f,f。并且你总是修改你唯一的数组f所以所有元素都包含相同的两个数字

你应该改变:

for(int j=0; j<2; j++){
f[0] = i;

for(int j=0; j<2; j++){
f = new int [2];
f[0] = i;

我不明白你的病情

if(!(G.contains(f))){

f永远不会出现在G中,因为你从来没有把它放在那里,所以没有可能到达那里

答案 2 :(得分:1)

我认为你是java新手。 我还假设这是一个示例程序,或某种练习。

您想检查列表是否包含数组。您使用的是list.contains,这是正确的。

问题是如何构建数组。

在以下代码段

   int [] f = new int [2]; 

   for(int i=0; i<2; i++)
   { 
      for(int j=0; j<2; j++)
      { 
         f[0] = i; 
         f[1] = j;
         list.add(f);
      }
  }

for循环之外,您只构建了一个数组 您实际上是一次又一次地添加到同一个数组。 并将此数组一次又一次地添加到列表中。该列表将包含4个元素,但所有4个元素都将引用相同的数组。

如果您希望列表包含不同的元素,则必须先创建它们:

for(int i=0; i<2; i++)
       { 
          for(int j=0; j<2; j++)
          { 
             int [] f = new int [2]; //<-- new array everytime
             f[0] = i; 
             f[1] = j;
             list.add(f);
          }
      }

来到你的包含支票:

您的检查将始终为false,因为列表G将始终为空(从您提供的代码中),您不会向其中添加任何内容。

由于G.contains...检查始终为falseG不包含任何内容),因此所有元素都会添加到New

如果您想要了解包含的示例代码,可能需要先向G添加内容。

       for(int i=0; i<2; i++)
       {  
             int [] f = new int [2]; //<-- new array everytime
             f[0] = i; 
             f[1] = i;
             G.add(f);
       }

     //G will now contain [0,0] and [1,1]

       for(int i=0; i<2; i++)
       { 
          for(int j=0; j<2; j++)
          { 
             int [] f = new int [2]; //<-- new array everytime
             f[0] = i; 
             f[1] = j;
             if(!G.contains(f))
             {
                New.add(f); //Will add only [0,1] and [1,0]
             }
          }
      }

最后的注释:在java中,通常使用小写变量名。 对于示例程序可能不是很重要,但尝试使用有意义的变量名称。像fG这样的名称传达不多。