이 코드에는 세 가지 큰 문제가 있습니다. char
가 원시적 형이기 때문에
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c.equals(vowels[i])){
String front = s.substring(0, i);
String back = s.substring(i + 1);
s = front + "" + back;
}
}
첫째, 당신은 char
에 equals
을 사용할 수 없습니다. ==
을 사용하십시오.
둘째, 모음을 제대로 확인하지 않습니다. 위의 코드는 's'의 0 번째 문자와 모음 배열의 0 번째 문자를 비교합니다. 즉,이 단어는 'a'
과 비교되지만 다른 모음에는 비교되지 않습니다. 마찬가지로 인덱스 1의 문자를 'e'
과 비교하지만 다른 모음은 비교하지 않으며 문자는 2에서 'i'
등으로 비교합니다.이 그리 크지 않기 때문에 인덱스 5에 도달하면 프로그램에서 예외가 발생합니다.
해결책은 더블 루프 (또는 중첩 루프)이 필요하다는 것입니다. s
에있는 각 문자의 경우 문자 (vowels
배열)의 문자를 확인해야합니다 (또는 적어도 일치 할 때까지). 그래서 당신은 새로운 방법으로 내부 루프를 이동, 그의 대답에서 증명 @cptcactus으로
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
boolean isAVowel = false;
for (int j = 0; j < vowels.length; j++) {
if (c == vowels[j]) {
isAVowel = true;
break; // will leave the inner loop but not the outer loop
}
// I'll let you finish the rest
뭔가를해야하는 것은 이러한 종류의 솔루션을 구현하는 좋은 방법입니다.
세 번째 문제는 더 미묘합니다. 배열이나 문자열에서 루프를 통해 인덱스를 반복 할 때 루프가 배열이나 문자열에서 요소를 제거하면 인덱스가 변경되므로 매우주의해야합니다. 코드가 약이 한 가정 :
for (int i = 0; i < s.length(); i++) {
if [[[ s.charAt(i) is a vowel ]]] {
[[[ remove the i'th character from s; ]]]
}
}
말 s
이 "air"
입니다. 먼저 i
은 0으로 설정되고 s.charAt(i)
은 'a'
입니다. 이것은 모음이므로 우리는 그것을 제거합니다. 즉, s
은 "ir"
입니다. 그런 다음 루프백하고 i
을 1로 설정하십시오. 이제 s.charAt(i)
은 s
의 새 값을 사용하므로 을 결코 보지 못하기 때문에 'r'
입니다.이 문제를 해결하려면
몇 가지 방법은 다음과 같습니다
그것은 (당신이 i++
을 취소 할 i--
를 사용할 수 있습니다)에서 당신이 문자를 제거하면 i
이 증가하지 않습니다 있는지 확인하십시오;
전달 대신에 색인을 통해 뒤로 이동합니다 (즉, s.length()-1
으로 시작하고 감소합니다).
(거기 replaceAll
방법 또는 Set<Character>
를 사용하여이 문제를 해결하는 다른 방법이 있습니다,하지만이 클래스라고 가정 해요 당신의 목적은 루프의 기초를 배우는 것입니다 같은.)
를
출처
2014-11-13 16:13:49
ajb
당신은 문자 배열 구현과 결혼 했습니까? 'String'에서 특정 문자를 제거하는 훨씬 쉬운 방법이 있습니다. – azurefrog
@ 모함마드 (Mohammad) 내가 결혼 한 관용어에서 왔던 곳은 사람에게 무언가에 대한 애착의 정도를 추정하는 매우 일반적인 방법입니다. 너에게 어떤 의미가 있니? – azurefrog
http://stackoverflow.com/questions/6056861/in-java-how-i-can-delete-vowels-are-a-e-i-o-and-u dup? – Wabonano