2010-11-30 14 views
1

配列がリストにないかどうかをチェックするコードを書いた後、それを別のリストに追加する必要があります。私はこれにリンクされたリストを使用しました。次のように私のコードは次のとおりです: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 

助けてください!!!!

答えて

2

のためにそれは複数のコピーを追加しません、それはオールウェイズあなたがして、Fをfとしている最初の繰り返しの後に新しいリスト項目としてFを追加するに

int [] f = new int [2]; 

を移動することです、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; 

:そして、あなたはオールウェイズ、変更すべき2つの同じ番号

conatinので、すべての要素Fあなただけの配列を・修正されています

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

fはあなたが決してそこに置くことがないので決してGにはないので、可能性はありませんそこに

+0

うんうん。はい、条件((G.contains(f))) が実際に何もしていない場合は、この問題を明確にするためにコードの一部を削除しました。どうもありがとう。 – aminx

3

私は間違っていない場合、これはJavaの

で、古典的なエラー

あなたは、新しいオブジェクトを作成していないです!あなたのリストには常に1つのオブジェクトが何度も繰り返して含まれています。 tyouがしたい義和

はあなたのループ

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では、小文字の変数名を使用するのが一般的です。 サンプルプログラムではあまりimportainではありませんが、意味のある変数名を持つようにしてください。 fGのような名前はあまり伝えません。

関連する問題