2010-11-30 4 views
1

배열이 목록에 없는지 확인하는 코드를 작성한 다음 다른 목록에 추가해야합니다. 나는 이것을 위해 연결된 목록을 사용했다. 다음과 같이 내 코드는 다음과 같습니다 :자바의 루프 내부에 목록을 추가 할 때의 문제

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

루프에 대한 귀하에

int [] f = new int [2]; 

을 이동하는 것입니다 , f, f, f, f, f, f, f, f 중 하나를 선택하십시오. 그리고 당신은에 allways

당신은 변경해야 같은 두 숫자 conatin 그래서 모든 요소 f를 유일한 배열을 modifing에 있습니다 :

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에 들어 있지 않으므로 가능한 게 없습니다. 거기에

+0

예. 작동합니다. 예 (! (G.contains (f))) 이 실제로 아무 것도하지 않으면이 문제를 명확히하기 위해 코드의 일부만 제거했습니다. 고마워. – aminx

3

자바

의 고전적인 오류가 새로운 객체를 생성하지 내가 잘못 아니에요 경우이입니다! 그래서 항상 당신의 목록에 하나의 객체를 반복해서 포함하는 동일한 하나의 자아를 추가하고 수정하십시오. tyou 원하는 뭐

은 F 첫 번째 반복 한 후 새 목록 항목으로는 다음 f를 한 f를, 그것은에 allways 추가 그것은 여러 복사본을 추가하지 않습니다

1

나는 당신이 자바를 처음 사용한다고 생각한다. 그리고 저는 이것이 샘플 프로그램이거나 일종의 연습이라고 가정합니다.

목록에 배열이 있는지 확인하고 싶습니다. list.contains을 사용하고 있습니다.

문제는 배열을 어떻게 구성하는지입니다. 다음에서

for 루프 밖에서는 구축하는 하나의 배열이,이

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

스 니펫.
실제로 동일한 배열에 계속 추가됩니다. 그리고이 배열을 반복하여 목록에 추가하십시오. 목록에는 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... 확인은 항상 false (G에는 아무 것도 포함되어 있지 않음)이므로 모든 요소는 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] 
      } 
      } 
     } 

최종 메모 : 자바에서는 일반적으로 소문자 변수 이름을 사용합니다. 샘플 프로그램에서는별로 유용하지 않지만 의미있는 변수 이름을 사용하십시오. fG과 같은 이름은별로 전달하지 않습니다.

관련 문제