2014-10-30 67 views
3

我正在編寫一個將英語翻譯成PigLatin的程序。我目前正在嘗試解決在哪裏找到單詞的第一個元音的部分,程序可以正確切分單詞並正確重新排列單詞。找出單詞中第一個元音的出現位置

例如,字符串「你好,我是一個人」變成「ellohay Iyay amyay ayay uygay」。 (在列表中,我認爲我的拉丁語是正確的,這是我創建的一個例子

因此,「what」變成「atwhay」這個單詞發現第一個元音位於第2個插槽, 。我整數,2

我想先比較它與一個字符串,元音=「aeiouy」,然後從那裏去,但我堅持 以下是我有:

public static int indexOfFirstVowel(String word){ 
    int index=0; 
    String vowels="aeiouy"; 
    return index; 

} 

理論上指數將更新到第一個元音的位置。

回答

4

這裏是你可以做的一種方式:

final static String vowels = "aeiouy"; 
public static int indexOfFirstVowel(String word){ 
    String loweredWord = word.toLowerCase(); 

    for (int index = 0; index < loweredWord.length(); index++) 
    { 
     if (vowels.contains(String.valueOf(loweredWord.charAt(index)))) 
     { 
      return index; 
     } 
    } 

    // handle cases where a vowel is not found 
    return -1; 
} 

這隻需通過字走過的性格,並檢查每個字符,看它是否你的元音字符串中存在。

1

你可以把每一個字符串中的字符與方法的charAt()

public static int englishVowelIndexOf(String word){ 
    char[] vowels = {'a','e','o','i','u','y'}; 
    String wordLowered = word.toLowerCase(); 
    for (int i=0; i < wordLowered.length(); i++){ 
     for (int j=0; j < vowels.length(); j++) { 
      if (wordLowered.charAt(i) == vowels[j]){ 
       return i; 
      } 
     } 
    } 
    return -1; 
} 
+0

你是慢了一點遺憾的是 – Mike 2014-10-30 18:14:44

+0

他錯了:P - 無論... – 2014-10-30 18:15:14

+1

轉換字小寫以避免出現問題:'word.toLowerCase()的charAt(我)' – Barranka 2014-10-30 18:16:01

0
public static int indexOfFirstVowel(String word){ 
    int i; 
    for(i=0; i<word.length();i++){ 
    switch(word.charAt(i)){ 
     case 'a': 
     case 'e': 
     case 'i': 
     case 'o': 
     case 'u': 
     case 'y': 
     return i; 
    } 
    } 
    return -1; 
} 
+0

不具有中斷(這對一些奇怪的邏輯來說不是問題),但是你沒有定義我的任何地方。 – 2014-10-30 18:20:28

+0

檢查一個字符串是否包含元音不是一個奇怪的邏輯。 – 2014-10-30 18:23:17

+0

@johnabrhm它需要12倍的空間來檢查一個字符是否被包含在預先存在的String或char []中。像.contains()這樣的內置方法可以防止你不必這樣做。 – furkle 2014-10-30 18:25:45

3

爲什麼不使用表示在ASCII表中的元音掩模(未推廣的)?

這不是最簡單的解決方案,但它確實很快,因爲它使用按位運算。如果未找到元音,則返回-1

public static int indexOfFirstVowel(String aString) { 
    for (int i = 0; i < aString.length(); i++) { 
     char c = aString.charAt(i); 

     if ((c > 64) & ((0x110411101104111L & (1L << (c - 65))) > 0)) { 
      return i; 
     } 
    } 

    return -1; 
} 

編輯:

我忘了推廣的ASCII表。

取代:

if ((c > 64) & ((0x110411101104111L & (1L << (c - 65))) > 0))

通過

if ((c > 64) & (c <= 121) & ((0x110411101104111L & (1L << (c - 65))) > 0)) 

其中121是用於'y'的ASCII碼。

相關問題