2010-03-07 3 views
5

이 작업을 수행하는 방법에 대한 기본적인 아이디어가 있지만 올바르게 작성했는지 확신 할 수 없습니다. 따라서 우리는 metod blow로 WindyString 클래스를 갖게되었습니다. 그것을 사용 후 :바람에 날리는 바람

System.out.println(WindyString.blow(
    "Abrakadabra!   The second chance to pass has already BEGUN! ")); 

우리는이 같은 것을 받아야한다 :

    e    a e   a   a ea y 
    br k d br ! Th s c nd ch nc t p ss h s lr d B G N! 
    A a a a a   e o    o   a    E U 

그렇게 매 초마다 단어 간단히 말해서 우리는 모든 모음을 선택하고 위의 그들에게 한 줄 이동합니다. 후반부에서는 모음을 한 줄 아래로 이동시킵니다.

tokenizer 또는 split 메서드로 토큰을 분할해야한다는 것을 알고 있습니다 만, 다음은 무엇입니까? 각 행을 나타내는 각각 3 개의 배열을 만드시겠습니까?

답변

2

가장 간단한 방법은 정규식을 사용하는 것입니다. 이 유익해야한다 :

static String blow(String s) { 
    String vowels = "aeiouAEIOU"; 
    String middle = s.replaceAll("[" + vowels + "]", " "); 
    int flip = 0; 
    String[] side = { "", "" }; 
    Scanner sc = new Scanner(s); 
    for (String word; (word = sc.findInLine("\\s*\\S*")) != null;) { 
     side[flip] += word.replaceAll(".", " "); 
     side[1-flip] += word.replaceAll("[^" + vowels + "]", " "); 
     flip = 1-flip; 
    } 
    return String.format("|%s|%n|%s|%n|%s|", side[0], middle, side[1]); 
} 

내가이 올바르게 여분의 공백을 처리하는 것을 보여주기 위해 출력에 | 문자를 추가 - 세 가지 라인은 공백, 선행 공백 돌보는 뒤, 같은 길이를 보장, 심지어된다 모든 공백 입력.

정규식에 익숙하지 않은 경우 학습을 시작하는 것이 좋습니다.

middle은 단순히 모든 모음이 공백으로 대체 된 원래 문자열입니다.

그런 다음 side[0]side[1]은 각각 위쪽 및 아래쪽 줄입니다. Scanner을 사용하여 모든 단어를 추출합니다 (선행 및 후행 공백 유지). 우리가 각 단어를 처리하는 방식은 한 쪽에서 모든 것이 공백으로 대체된다는 것입니다. 다른 경우에는 비 모음 만이 공백으로 대체됩니다. 우리는 우리가 처리하는 모든 단어로 측면을 뒤집습니다.

+0

이 정규식을 통해 나를 이끌 수 있습니까? – owca

+0

Regexes는 매우 까다로울 수 있지만 여기서는 기본 요소 만 사용하고 있습니다. 특히 문자 클래스'''''''''''''''''''''''''''''''''''''''''''''' 낙담하지 마십시오 : 정규식은 매우 강력한 도구입니다. – polygenelubricants

5

예, 아마도 문제를 해결하기위한 쉬운 방법입니다.

3 개의 배열을 만듭니다. 하나는 실제 데이터로 채워지고 두 개의 배열은 ' '으로 채워집니다 (Arrays.fill).

그런 다음 실제 데이터가 들어있는 배열을 반복하고 현재 단어가있는 정수를 유지하고 이미 공백과 일치하면 부울을 유지하십시오.

반복하면서 문자가 모음인지 확인합니다. 모음 인 경우 단어 수 (oddness/evenness)를 확인하고 첫 번째 또는 세 번째 배열에 배치하십시오. 공백에 도달하면 부울을 설정하고 단어 수를 늘리십시오. 다른 공백에 도달하면 공백이 이미 설정되어 있는지 확인하십시오. 공백이 설정된 경우 계속하십시오. 비 공백 문자와 일치하는 경우, 공백 부울을 재설정하십시오.

그런 다음 모든 배열을 함께 결합하고 조인 된 각 배열 사이에 줄 바꿈 문자를 추가하고 해당 문자열을 반환하십시오.

관련 문제