2014-10-11 3 views
4

영어를 스웨덴 요리사의 가짜 언어로 번역하려고합니다. 우선 순위의 언어 규칙은 다음과 같습니다.사용자 입력을 무시 무시한 대화로 바꾸기

  • "AN"의 모든 항목을 "UN"으로 바꿉니다.
  • "AU"의 모든 항목을 "OO"로 바꿉니다.
  • 단어 끝에없는 "A"가 모두 "E"로 바뀝니다.
  • "OW"의 모든 항목을 "OO"로 바꿉니다.
  • 모든 "O"를 "U"로 바꿉니다.
  • 단어 시작 부분 이외의 "I"의 첫 번째 발생을 "EE"로 바꿉니다.
  • 단어 끝의 모든 "EN"을 "EE"로 바꿉니다.
  • 단어 끝의 모든 "E"를 "E-A"로 바꿉니다.
  • 단어의 시작 부분에있는 "E"가 모두 "I"로 바뀝니다.
  • 모든 "U"를 "OO"로 바꿉니다.

저자는 번역되어야하지만 내 코드는 UUTHOR로 번역됩니다. 이것은 제 코드가 다섯 번째 규칙 ("OO"가있는 경우)을 따르기 때문입니다.

그렇다면 다섯 번째 매개 변수가 "OO"가 아닌 단일 "O"를 볼 때만 적용하려면 어떻게해야합니까?

String entry; 
String entry6; 
String entry7; 
String entry8; 
String entry9; 
String entry11; 
String entry10; 
String end; 

System.out.println("WELCOME TO THE SWEDISH CHEF TRANSLATOR!"); 
Scanner scan = new Scanner(System.in); 
System.out.print("Please enter a phrase in english: "); 
entry = scan.next(); 

String entry1 = entry; 
int length = entry1.length(); 
String entry4; 

System.out.println("1: " + entry1); 
// AN TO UN 
String entry2 = entry.replace("AN", "UN"); 
System.out.println("2: " + entry2); 

// AU TO OO 
String entry3 = entry2.replace("AU", "OO"); 
System.out.println("3: " + entry3); 

// A TO E 
String lastL = entry3.substring(length - 1, length); 
int index2 = lastL.indexOf("A"); 
if (index2 < 0) { 
    entry4 = entry3.replace("A", "E"); 
} else { 
    String beg = entry3.substring(0, length - 1); 
    String replacedA = beg.replace("A", "E"); 
    System.out.print(replacedA); 
    entry4 = lastL; 
} 
System.out.println("4: " + entry4); 

// OW TO OO 
String entry5 = entry4.replace("OW", "OO"); 
System.out.println("5: " + entry5); 

// O TO U 
entry6 = entry5.replace("O", "U"); 
System.out.println("6: " + entry6); 

// I TO EE 
String firstL = entry6.substring(0, 1); 
int index3 = firstL.indexOf("I"); 
if (index3 < 0) { 
    entry7 = entry6.replaceFirst("I", "EE"); 
} else { 
    String endWord = entry6.substring(1, length); 
    String replacedI = endWord.replaceFirst("I", "EE"); 
    entry7 = firstL + replacedI; 
} 
System.out.println("7: " + entry7); 

// EN TO EE 
length = entry7.length(); 
String En = entry7.substring(length - 2, length); 
String substring2 = En.replace("EN", "EE"); 
entry8 = entry7.substring(0, length - 2) + substring2; 
System.out.println("8: " + entry8); 

// E to E-A 
String lastL2 = entry8.substring(length - 1, length); 
int index4 = lastL2.indexOf("E"); 
if (index4 < 0) { 
    entry9 = entry8; 
} else { 
    String replacedE = lastL2.replace("E", "E-A"); 
    entry9 = entry8.substring(0, length - 1) + replacedE; 
} 
System.out.println("9: " + entry9); 

// E TO I 
String firstL2 = entry9.substring(0, 1); 
length = entry9.length(); 
int index5 = firstL2.indexOf("E"); 

if (index5 < 0) { 
    entry10 = entry9; 
} else { 
    end = entry9.substring(1, length); 
    entry10 = "I" + end; 
} 
System.out.println("10:" + entry10); 

// U to OO 
entry11 = entry10.replace("U", "OO"); 
System.out.println("11:" + entry11); 
+5

그리고 코드에 어떤 문제가 있습니까? –

+0

그럴 필요가없는 이유는 무엇입니까? Bork bork bork! http://www.tuco.de/home/jschef.htm – DNA

+0

해시 맵 데이터 구조를 사용할 수 있습니까? (아마도 아닐 것이다) –

답변

1

복사 변환 된 새로운 문자열로 문자열의 부분과 원래의 시작점을 증가 유지 :

이 내 코드입니다. 그렇지 않으면 문자열의 변환 된 부분도 계속 대체됩니다. (하지 테스트)

간단한 알고리즘 :

output = "" 
x=0 
for (i=0;i<input.length;i++) 
    holder = input.substring(x,i); 
    if(holder.endswith(<iterate all replaceable patterns>)) 
     x = i; 
     output += holder.substring(0, holder.length - pattern.length); //get non-replaceable part 
     output += applyReplacement(detectedpattern); 
output += holder //collect any remaining chars 
+0

좀 더 자세히 설명해 주시겠습니까? 미안 해요 컴프 2 클래스의 초심자. – OoOoOoOoOoO

+0

에 샘플 알고리즘이 추가되었습니다. 구현은 당신에게 달려 있습니다 ... – Rohit

1

나는 다른 접근 방식을 사용하여 이것에 대해 갈 것입니다.

StringBuilder 또는 StringBuffer을 사용하십시오.

StringBuilder target = new StringBuilder(); 

입력란에 색인을 유지하고 새 단어의 시작 부분에 있는지 여부를 알려주는 플래그를 유지하십시오.

int curr = 0; 

이제 두 문자 조합을 검사하여 항목을 검색하십시오. 일치하는 경우 (단어 시작/끝 규칙 포함) target 변수에 적절한 문자를 추가하고 curr에 2를 추가하십시오.

다음 글자를 확인하십시오. 일치하는 경우 해당 문자를 target에 추가하고 curr에 1을 추가하십시오.

일치하는 항목이없는 경우 현재 문자 (entry.charAt(curr))를 target에 추가하고 curr에 1을 추가하십시오.

문자열 끝에 도달하면 target을 String으로 변환하면 작업이 완료됩니다.

0

다른 변수에 텍스트 사본을 보관하십시오. 첫 번째 텍스트에서 문자를 바꿀 때마다 사본의 해당 문자를 %으로 바꿉니다. 복사본의 해당 문자가 %이 아닌 경우 첫 번째 텍스트의 문자 만 바꿉니다. 이것을 코드에 추가하면 번거롭지 않게 작동합니다.