2017-02-10 1 views
1

자 그럼 Java 코드에서 클래스를 따라 가면서이 코드를 사용하여 문자 배열의 메서드에 의해 생성 된 소문자의 인스턴스를 계산하도록 요청 받았습니다. 코드를 따라 가면 같은 것을 던질 수 있습니다. "counts [chars [currentIndex] - 'a'] ++;"배열 내의 배열?

그렇습니다. 코드는 countLetters라고하는 public 메서드를 만들고 있으며, 본체의 어딘가에서 호출해야하고, 문자 배열 매개 변수가 필요하다는 것을 알았습니다. counts라는 정수형 배열을 만들고 그 크기는 26입니다 (알파벳의 총 소문자 수와 같은 크기입니다.) 그런 다음 배열에 일반적으로 필요한 for 함수를 실행합니다. currentIndex라는 변수를 만듭니다. 기본값은 0입니다. 현재 인덱스는 chars 문자 배열의 크기보다 작습니다. 그런 다음 for 루프가 실제로 무엇을하는지 가져옵니다. 그리고 도대체 뭐하고 있니? 그것은 카운트 인덱스의 크기를 증가시키고 있습니까? 배열 내의 일부 배열과 소문자 'a'의 숫자 값을 뺀 것과 같이 전체가 이상합니다. 어쨌든 카운트의 currentIndex를 수정하고 있습니다. 'a'의 숫자 값을 빼는 것이 필요한 이유는 무엇입니까? 여기 26 개가 충분하지 않을까요?

누군가가 천천히 그리고 완전한 평신도의 용어로 어떻게 설명 할 수 있습니까? 나는 정말로 초보 프로그래머이고이 물건은 나에게서 지옥을 혼란스럽게하고있다. 그래서 Smashmouth 노래가가는 것에 따라, 나는 나와 맺어 줘라, 나는 창고에서 가장 날카로운 도구가 아니다. 당신이 무슨 일이 일어나고 있는지 부러 뜨릴 수 있다면, 나는 농담을 떠나서, 나는 고맙겠습니다.

//count the occurrences of each letter 
public static int[] countLetters(char[] chars){ 
//declare and create an array of 26 int 
int[] counts = new int[26]; 

//for each lowercase letter in the array, count it 
for (int currentIndex = 0; currentIndex < chars.length; currentIndex++) 
counts[chars[currentIndex] - 'a']++; 

return counts; 
} 

답변

3

Alrightey 때문에이 라인 :

counts[chars[currentIndex] - 'a']++; 

이 모두를위한 짧은인가 :

// Get the current character from the array: 
char character = chars[currentIndex]; 

// Characters are just numbers. Check out e.g. an "ASCII table". 
// So, let's start treating them like numbers and take 'a' from that. 
int indexInCounts = character - 'a'; 

// Increase the count for that letter: 
counts[indexInCounts] = counts[indexInCounts] + 1; 

왜 'A'?

배열은 0에서 시작합니다. 질문에서 언급 했으므로 지금까지의 배열과 유사합니다. 우리가 카운트 [0] 입력에서의의 수를 나타냅니다 싶다면, 우리 '는'0

  • 에 넣어해야합니다 '는이'- 'A'는 0
  • 입니다
  • 'B는'- 'A'는 1

등등

그래서, 편리 데려가 '는'우리의 입력 문자는 우리에게 우리의 배열 인덱스를 위해 큰 일을거야 수를 제공합니다에서.

편지를 버리는 문자가 너무 이상합니다!

컴퓨터는 실제로 숫자 만 처리합니다. an ASCII table을 당기고 문자 (아스키 코드화 체계) 기본 번호에 매핑하는 방법을 당신이 볼 수있는 쉬운 방법을 얻을 :

  • 97 : 소문자 'a'는
  • 98 : 소문자 'B'
  • 99 : 소문자 'c' .. 등등!

잘하면 그게 어디로 가는지 볼 수 있습니다!

98 ( B) - 97 ()는 예를 들면, 미국 1의 인덱스를 제공한다.

시도해보세요. 대괄호를 잊어 버리지 마세요.

실험을 원한다면 위의 행을 바꿀 수 있지만 for 루프의 대괄호를 잊지 마십시오!

for(int a=...) 
    doSomething(); // Only this first line is looped 
    doSomethingElse(); // This happens *once*! 

암시 괄호라고하며 단지 편리한 것입니다. 그럼 여기에 전체 확장 버전이 있습니다.

그런 것들을 바로 작성해야합니까?

아니요, 아니요! 실제로는 위에서 보았던 확장 버전부터 시작합니다 (대부분 counts[indexInCounts]++;을 즉시 사용 하겠지만). 변수가 일단 사용 만하면 그 다음에 실제 값을 대체하는 것이 더 쉽다 -과 같이 모든 코멘트를하지 않고 :

char character = chars[currentIndex]; 

int indexInCounts = character - 'a'; // Character is only used once. 

counts[indexInCounts]++; // indexInCounts is only used once. 

2 단계 :

char character = chars[currentIndex]; 
counts[character - 'a']++; // Character is only used once. 

마지막으로, 마법의 라인 돌아 :

counts[chars[currentIndex] - 'a']++; 

예측 오류

당신이 그걸 알아 차렸다고 생각한다면, 사악한 공백 문자를 입력에 넣으면 어떤 오류가 나올지 예측해보십시오.

여기 스포일러입니다 :

당신은 범위 예외를 벗어난 인덱스를 얻을 수 있습니다. 공백은 ASCII 테이블에 입니다. 32 - 97은 매우 음수이며, counts 배열의 수용 가능한 0-25 범위를 벗어납니다.

p.s. I'm not the sharpest tool in the shed - 나는 영원히 항상 동의하지 않을 것이다. (노래를 제외하고, 그것은 위대한 다) :) 모두가 어딘가에서 시작해야하고 너는 그것을 시도해보고있어.

+0

그 결말에 추가하려면 다음과 같이하십시오. _ 빛나지 않으면 결코 빛나지 않을 것입니다! –

+0

정말 고맙습니다. 배열 참조가 다른 배열 인덱스 값을 참조하는 것이 약간 이상했습니다. 그것은 이해하지만, counts는 chars 배열의 currentIndex 값에서 문자를 가져 와서 1을 더하는 인덱스를 계산 한 다음 'a'의 숫자 값을 97만큼 뺍니다. 결과는 모두 정확하고 정확합니다 소문자 범위를 벗어난 문자를 제외하고 count에 대해 배열을 설정합니다. 알고 주셔서 감사합니다, 나는 바보 같아요, 하. – Strom

+0

@Strom 전혀 문제가 없습니다! 다행스럽게도 그 모든 것을 보았을 것입니다. (나는 그 대답을 몇 번 편집했는데, 새로 고침을하거나 작은 "답변을 편집 했음 - 클릭하여 새로 고침"버튼을 확인했습니다). –