2011-11-28 3 views
3

나는 for-each 루프를 사용하여 기본 자바 프로그램에서 char의 2 차원 배열을 이동한다. 끝에 작은 부분을 제외하고는 작동합니다.for each와 2 차원 배열에 할당하기 Java

static String letters = "abcdefghijklmnopqrstuvwxyz"; 

public static boolean checkIsNumeric(String s) { 
    boolean haveBeenNonDigitCharacters = false; 
    char[] chars = s.toCharArray(); 
    for(char c : chars) 
     if(!Character.isDigit(c)) { 
      haveBeenNonDigitCharacters = true; 
      break; 
     } 

    if(haveBeenNonDigitCharacters) 
     return false; 
    else 
     return true; 
} 

public static char[][] createArray() { 
    String height; 
    String width; 
    Scanner s = new Scanner(System.in); 
    do { 
     System.out.println("How tall do you want the array to be?"); 
     height = s.next(); 
    } while(!checkIsNumeric(height)); 
    do { 
     System.out.println("How wide do you want the array to be?"); 
     width = s.next(); 
    } while(!checkIsNumeric(width)); 

    int intHeight = Integer.parseInt(height); 
    int intWidth = Integer.parseInt(width); 

    char[][] chars = new char[intWidth][intHeight]; 

    for(char c[] : chars) { 
     for(char d : c) 
      d = ' '; 
    } 

    return chars; 
} 

public static char[][] fillArray(char[][] a) { 
    int counter = 0; 
    for(char c[] : a) { 
     for(char d : c) { 
      if(counter >= 26) 
       counter = 0; 
      d = letters.charAt(counter); 
      counter++; 
     } 
    } 
    return a; 
} 

public static void main(String[] args) { 
    char[][] chars = createArray(); 
    chars = fillArray(chars); 

    for(char c[] : chars) { 
     for(char d : c) { 
      System.out.print(d); 
      if(d == ' ') 
      System.out.print("a"); 
     } 
     System.out.println(""); 
    } 
} 

는 기본적으로, 내가 원하는 무엇을, 사용자 지정 크기와 어떤 2 ​​차원 배열을하고,이 가득 찰 때까지 반복해서 알파벳의 편지와 함께 그것을 채울 수 있습니다 : 여기 내 클래스입니다. checkIsNumeric 메서드는 String이 숫자인지 확인하고 createArray 메서드는 사용자 지정 차원을 사용하여 2 차원 배열을 만들고 fillArray 메서드는 문자열의 문자로 배열을 채 웁니다. 하지만 메인의 끝에서 배열을 반복하면서 각 문자를 인쇄하면 아무 것도 인쇄되지 않습니다. 왜?

답변

6

로 변경 fillArray 다음 피 각 루프에 의해 생성

public static char[][] fillArray(char[][] a) { 
    int counter = 0; 

    for (int i = 0; i < a.length; i++) { 
     for (int j = 0; j < a[i].length; j++) { 
      if(counter >= 26) 
       counter = 0; 
      a[i][j] = letters.charAt(counter); 
      counter++; 
     } 
    } 

    return a; 
} 

그래서 실제 어레이 a 수정되는 것이 아니라 복사. 각 char' '에 초기화되도록하려면

How tall do you want the array to be? 
5 
How wide do you want the array to be? 
4 
abcde 
fghij 
klmno 
pqrst 

같은이 createArray 간다 : (I 올바른 가정)의 출력을 줄 것이다

. main에서, 경우에 당신은 int으로 d 캐스팅하고 0

+0

Perfect- 당신을 감사합니다. 왜 for-each는 같은 일을하지 않습니까? –

+0

@Rickay :'d' ('char d : c')는 배열의 특정 위치에있는'char'의 복사본입니다. 그것은 배열 안의'char'에 대한 참조가 아니므로 본질적으로 그 값을 임시 변수에 할당 할 수 있습니다. – AusCBloke

+0

아 ... 나는 각 루프가 그렇게 작동한다는 것을 결코 알지 못했습니다! 와우 감사합니다! –

1

당신은 문자를 할당하는 초기 값 (D) 값 ''을의에 각 char가 설정되어있는 것을 볼 수 있습니다 그것을 인쇄 , d의 범위는 사라집니다. 이 아니며 배열의 값을 할당하는 코드는이 아닙니다.

1

일반적으로 문제는 for-each 루프에 정의 된 변수에 새 값을 할당 할 수없고 반복되는 기본 데이터 구조가 수정 될 것으로 예상된다는 것입니다. 예를 들어이 코드는 배열에 영향이 없습니다 :

int[] array = {1, 2, 3}; 

for (int e : array) 
    e = 0;   // array doesn't change! 

실제로 배열을 수정을, 당신은이 작업을 수행 할 필요가 :

for (int i = 0, n = array.length; i < n; i++) 
    array[i] = 0; // now all elements in array are zero 
관련 문제