2015-10-15 146 views
-3
import java.util.Scanner; 
import java.util.Arrays; 

public class PigLatin 
{ 



    public static void main (String[] args) { 
    System.out.println("Translate or Reverse"); 
    Scanner choose = new Scanner(System.in); 
    String choice = choose.nextLine(); 
    Scanner input = new Scanner(System.in); 
    String ipWord = input.nextLine(); 




    if (choice.equals("Translate")) 
    { 


     System.out.println(translator(ipWord)); 

    } 
    else if(choice.equals("Reverse")) 
    { 
     System.out.println(reverse(ipWord)); 
    } 
    else 
    { 
     System.out.println("Error"); 
    } 

} 
    public static String translator(String ipWord) 

    { 
    String[] wordsArray = ipWord.split(" "); 
    String result = ""; 

    for(int j =0;j<wordsArray.length;j++) 
    { 

     if(wordsArray[j].charAt(0)=='a' || wordsArray[j].charAt(0) =='e' || wordsArray[j].charAt(0)== 'i' || wordsArray[j].charAt(0)== 'o' || wordsArray[j].charAt(0)== 'u'|| wordsArray[j].charAt(0)=='A' || wordsArray[j].charAt(0) =='E' || wordsArray[j].charAt(0)== 'I' || wordsArray[j].charAt(0)== 'O' || wordsArray[j].charAt(0)== 'U') 
/* I check if it is begin with vowel. If it begin with vowels + "yay". For example "Eat">"Eatyay"*/ 
     { 
     result = result+ " " + wordsArray[j] +"yay"; 
     } 

     else 
     { 
     for (int i = 1; i<= wordsArray.length; i++) 
     { 
      if(wordsArray[j].charAt(0)=='B'||wordsArray[j].charAt(0)=='C'||wordsArray[j].charAt(0)=='D'||wordsArray[j].charAt(0)=='F'||wordsArray[j].charAt(0)=='G'||wordsArray[j].charAt(0)=='H'||wordsArray[j].charAt(0)=='J'||wordsArray[j].charAt(0)=='K'||wordsArray[j].charAt(0)=='L'||wordsArray[j].charAt(0)=='M'||wordsArray[j].charAt(0)=='N'||wordsArray[j].charAt(0)=='P'||wordsArray[j].charAt(0)=='Q'||wordsArray[j].charAt(0)=='R'||wordsArray[j].charAt(0)=='S'||wordsArray[j].charAt(0)=='T'||wordsArray[j].charAt(0)=='V'||wordsArray[j].charAt(0)=='X'||wordsArray[j].charAt(0)=='Z'||wordsArray[j].charAt(0)=='W'||wordsArray[j].charAt(0)=='Y') 
/* I check if it begin with a UpperCase Consonants, then I will take every consonant before the first vowel, move it to the back and add "ay" 
. For example, "World" > "Orldway" ; "String" > "Ingstryay" */ 
      { 
      if (wordsArray[j].charAt(i)=='a' || wordsArray[j].charAt(i) =='e' || wordsArray[j].charAt(i)== 'i' || wordsArray[j].charAt(i)== 'o' || wordsArray[j].charAt(i)== 'u') 
      { 
       result = result+ " " + wordsArray[j].substring(i,i+1).toUpperCase()+ wordsArray[j].substring(i+1)+wordsArray[j].substring(i-1,i).toLowerCase() +"ay"; 
      } 


      } 

      else 
      { 
      if (wordsArray[j].charAt(i)=='a' || wordsArray[j].charAt(i) =='e' || wordsArray[j].charAt(i)== 'i' || wordsArray[j].charAt(i)== 'o' || wordsArray[j].charAt(i)== 'u'|| wordsArray[j].charAt(j)=='A' || wordsArray[j].charAt(j) =='E' || wordsArray[j].charAt(j)== 'I' || wordsArray[j].charAt(j)== 'O' || wordsArray[j].charAt(j)== 'U') 
      { 
       result = result+ " " + wordsArray[j].substring(i)+ wordsArray[j].substring(0,i) +"ay"; 
      } 

      } 



     } 


     } 

    } 
    return result; 
    } 
    public static String reverse (String ipWord) 
    { 
    String[] wordsArray = ipWord.split(" "); 
    String result = ""; 
    for(int h = 0 ; h < wordsArray.length ; h++) 
    { 
     if(wordsArray[h].charAt(wordsArray[h].length()-3)=='y') 

     { 
     result = result + " " + wordsArray[h].charAt(wordsArray[h].length()-4) + wordsArray[h].substring(0,wordsArray[h].length()-4); 

     } 
     else 
     { 
     result = result + wordsArray[h].substring(0,wordsArray[h].length()-2); 
     } 
    } 
    return result; 
    } 
} 

在這裏,我修好了。我認爲它不能翻譯超過2個單詞。如果我嘗試翻譯嗨,你好嗎。錯誤是:我該如何解決這個豬拉丁語翻譯器?

java.lang.StringIndexOutOfBoundsException: String index out of range: 2 
    at java.lang.String.charAt(Unknown Source) 
    at PigLatin.translator(PigLatin.java:56) 
    at PigLatin.main(PigLatin.java:23) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)*/ 
+2

'它總是報告錯誤'最新的錯誤?,接下來不需要2個'Scanner'objs。 – Satya

+0

@Satya我認爲他意味着它只是打印出「錯誤」,這是他的打印語句之一,但idk只是一個想法...而不是'choice.equals('嘗試'choice.equalsIgnoreCase(' – 3kings

+0

我只是更新代碼,Sr沒有提及清楚 –

回答

1

始終信任錯誤。他們知道他們在說什麼。如果他們說你超出範圍 - 你確實超出範圍,你甚至知道確切的位置。您沒有標出該行,但不難發現:

if (wordsArray[j].charAt(i)=='a' || ... 

什麼可能超出範圍? wordsArray[j]不存在或charAt(i)不存在。這是什麼?

j受單詞數量的限制。我們在這裏很清楚。這留下了另一個。現在,這是什麼意思i ...

for (int i = 1; i<= wordsArray.length; i++) 

這似乎也由wordsArray單詞量的約束。從1開始,所以它永遠不會顯示第一個單詞,但這是不相關的,因爲獲取單詞不是你使用它的目的。實際上,導致錯誤的原因是,您希望第j個單詞具有與輸入中的單詞相同的字母。

+0

所以你能告訴我如何請修復? –