2014-11-13 4 views
1
package loopPractice; 
import java.util.Scanner; 

public class replaceVowels { 
    static Scanner sc = new Scanner(System.in); 

    public static void main(String[] args) { 
    System.out.print("Enter a string: "); 
    String s = sc.nextLine(); 
    String originalString = s; 

    char[] vowels = {'a', 'e', 'i', 'o', 'u'}; 


    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; 
     } 
    } 
    System.out.println(originalString); 
    System.out.println(s); 
    } 
} 

단어의 모든 모음을 대체하는 것입니다. 모음 모음을 사용하여 모든 모음을 어떻게 바꿀 수 있습니까?char와 char 배열을 비교합니까?

질문입니다 : 문자열 매개 변수의 카피 인 문자열을 반환하는 방법을 쓸 수 있지만없는

+5

당신은 문자 배열 구현과 결혼 했습니까? 'String'에서 특정 문자를 제거하는 훨씬 쉬운 방법이 있습니다. – azurefrog

+0

@ 모함마드 (Mohammad) 내가 결혼 한 관용어에서 왔던 곳은 사람에게 무언가에 대한 애착의 정도를 추정하는 매우 일반적인 방법입니다. 너에게 어떤 의미가 있니? – azurefrog

+0

http://stackoverflow.com/questions/6056861/in-java-how-i-can-delete-vowels-are-a-e-i-o-and-u dup? – Wabonano

답변

2

음, 질문의 정신에, 당신이 경우 확인하는 새로운 기능을 작성할 수 있습니다 자세한 내용은 정규식이 (해당하지만, 간단하게) 될 것 java.util.regex.Pattern;

더 간단을에서 자바 독을 읽어 배열에 문자가 포함되어 있습니다.

public static void main(String[] args) { 
    System.out.print("Enter a string: "); 
    String s = sc.nextLine(); 
    String originalString = s; 

    char[] vowels = {'a', 'e', 'i', 'o', 'u'}; 

    for (int i = 0; i < s.length(); i++) { 
     char c = s.charAt(i); 
     if (contains(c, vowels)) { 
      String front = s.substring(0, i); 
      String back = s.substring(i + 1); 
      s = front + "" + back; 
     } 
    } 

    System.out.println(originalString); 
    System.out.println(s); 
} 

private static boolean contains(char c, char[] arr) { 
    for (int i = 0; i < arr.length; i++) { 
     if (arr[i] == c) { 
      return true; 
     } 
    } 
    return false; 
} 
0
String.replaceAll("[aeiou](?!\\b)", ""); 

읽고 어떤 모음 : 모두 매치 모음 ([AEIOU])을 준수하지 ((?! ...)) "단어의 끝"(\ b).

String.replaceAll("[aeiou]\\B", ""); 
+0

질문에 "모음 모음 사용하기"라는 메시지가 표시되므로 이것이 만족스러운 해결책인지 확신 할 수 없습니다. – ajb

1

이 코드에는 세 가지 큰 문제가 있습니다. 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; 
    } 
} 

첫째, 당신은 charequals을 사용할 수 없습니다. ==을 사용하십시오.

둘째, 모음을 제대로 확인하지 않습니다. 위의 코드는 '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>를 사용하여이 문제를 해결하는 다른 방법이 있습니다,하지만이 클래스라고 가정 해요 당신의 목적은 루프의 기초를 배우는 것입니다 같은.)

관련 문제