2009-11-28 6 views
1

Java 질문이 있습니다. 문자열을 읽고 해당 문자열의 문자 수를 표시하는 프로그램을 작성하고 있습니다. 몇 가지 예제 코드를 찾았지만 마지막 부분을 이해하지 못합니다. 누구든지 도와 줄 수 있습니까?문자열의 문자 수 표시

int[] count = countLetters(line.toLowerCase()); 

for (int i=0; i<count.length; i++) 
{ 
    if ((i + 1) % 10 == 0) 
      System.out.println((char) ('a' + i)+ " " + count[i]); 
    else 
     System.out.print((char) ('a' + i)+ " " + count[i]+ " "); 
} 

public static int[] countLetters(String line) 
{ 
    int[] count = new int[26]; 

    for (int i = 0; i<line.length(); i++) 
    { 
     if (Character.isLetter(line.charAt(i))) 
      count[(int)(line.charAt(i) - 'a')]++; 
    } 

    return count; 
} 
+0

엄격한 요구 사항과 엄격한 입력 검사가 없다면이 코드는 대문자, 숫자, 비 ASCII 문자, 공백 등과 같은 다양한 문자를 입력 할 때마다 중단됩니다. 기본적으로 "a" 및 "z". – Bombe

답변

2

귀하의 마지막 루프는 다음과 같습니다 우리가 그래, 우리는 그 문자 카운터 상대적으로 증가하는 경우는, 편지의 경우 테스트의 모든 문자에 대한

. 'a'는 0이고 'b'는 1입니다. 즉, 'a'는 'a'- 'a'는 0이고 'b'는 'b'- 'a'입니다. 1 ...).

이것은 문자열에서 문자의 발생 횟수를 계산하는 일반적인 방법입니다.

1

게시 한 코드는 문자열의 길이가 아니라 소문자로 된 문자열에 나오는 알파벳 문자의 개수를 계산합니다.

Character.isLetter(line.charAt(i)) 

위치 i에있는 문자를 검색하고 편지의 경우 true를 반환합니다.

count[(int)(line.charAt(i) - 'a')]++; 

260이다 character - 'a' 인덱스의 수를 증가시킨다.

이 함수의 결과는 문자 당 카운트를 포함하는 26 개의 정수 배열입니다. 카운트 어레이 위에 루프

는 인쇄물마다 10 카운트를 종료하고, 카운트가 속하는 문자를 인쇄

(char) ('a' + i) 

를 이용한다.

0

문자가 아닌 문자 ('5'는 문자이기도 함)가 아닌지 생각해보십시오.

마지막 부분 :이 편지는 경우 각 문자의 입력 라인과 검사를 통해 반복 할

for (int i = 0; i<line.length(); i++) 
{ 
    if (Character.isLetter(line.charAt(i))) 
     count[(int)(line.charAt(i) - 'a')]++; 
} 

. 일치하는 경우 해당 문자의 수를 증가시킵니다. 카운트는 26 개의 정수 배열로 유지됩니다 (라틴 알파벳 26 자). 문자 'a'의 개수는 인덱스 0, 문자 'b'는 1, 'z'는 25로 유지됩니다. 인덱스를 얻으려면 코드가 문자 값에서 'a'값을 뺍니다 (각 문자는 문자 일뿐만 아니라/glyph뿐만 아니라 숫자 값). 따라서 문자가 'a'이면 0이되어야하는 'a'의 값을 뺍니다.

0

countLetters 메서드에서 for 루프는 줄의 모든 문자를 통과합니다. if은 문자인지 확인하고, 그렇지 않으면 무시됩니다.

line.charAt()은 i 위치에 단일 문자를 생성합니다. 이 유형은 char입니다.

Java는 Java 내부에서 문자 코드에 해당하는 숫자입니다. 소문자 'a'는 97의 문자 코드를 가지며 'b'는 98 등입니다. (int)char에서 int으로 강제 변환합니다. 그래서 문자 코드를 취해 봅시다. 'b'라고 가정 해 봅시다. 코드는 98이고 'a'는 97을 뺍니다. 그래서 오프셋 1 (알파벳의 시작 부분부터)을 얻습니다.알파벳의 모든 문자의 경우 오프셋은 0과 25 사이의 값을 갖습니다.

따라서이 오프셋을 배열 count의 인덱스로 사용하고 ++을 사용하여 오프셋을 증가시킵니다. 그런 다음 나중에 프로그램 상단의 루프가 카운트를 인쇄 할 수 있습니다.

상단의 루프는 역방향 "트릭"을 사용하여 0에서 25까지의 오프셋을 a에서 z로 문자로 다시 변환합니다.

0

'마지막 부분'은 루프의 구현을 이해하기가 어렵습니다.

public static int[] countAllASCII(String line) { 
    int[] count = new int[256]; 
    char[] chars = line.toCharArray(); 

    for (char c : chars) { 
    int index = (int) c; 
    if (index < 256) { 
     count[index]++; 
    } 
    } 

    return count; 
} 

public static int[] countLetters(String line) { 
    int[] countAll = countAll(line);   
    int[] result = new int[26];  
    System.arraycopy(countAll, (int) 'a', result, 0, 26); 

    return result; 
} 

일반 아이디어 : 다음 countAll 방법은 바로 카운트하여 여기에 계산 방법의 리팩토링 (두 방법의 분할, 모든 문자에 대한 일반적인 하나의 단지 작은 대문자에 대한에 대한 특별이야) 난처 닫기 모든 chars. 배열은 더 크지 만,이 차원에서 아무도 신경 쓰지 않는다. 장점 : 각 char을 테스트 할 필요가 없다. 두 번째 방법은 관심 영역을 새로운 (결과) 배열로 복사 한 다음 반환한다. 그것.

편집

나는 덜 친구 목록에서 취소에 대한 내 코드를 변경했던 고맙다. 어쨌든 고마워, Bombe.

+0

US-ASCII가 아닌 문자가 있으면이 기능이 훌륭하게 실패합니다. 오신 것을 환영합니다. 2009 년입니다. 그리고 당신은 여전히 ​​문자가 8 비트 너비 밖에 안되는 것으로 가정합니다 ... – Bombe