2014-10-30 70 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码。

相关问题