【问题标题】:how to find index of first vowel in a string?如何找到字符串中第一个元音的索引?
【发布时间】:2015-10-07 13:57:29
【问题描述】:

这部分我想实现但不知道如何: 在 Pig Latin 中,直到第一个元音的所有辅音都应该移到单词的末尾。所以虽然“laptop”仍然是“aptoplay”,但“string”应该变成“ingStray”。

我有这个,第一部分很好用。

public static String doStuff(String word) {
    int number = 0;
    char[] vowel = { 'a', 'e', 'i', 'o', 'u' };
    char first = word.charAt(0);
    char second = Character.toLowerCase(first);
    if (second == 'a' || second == 'e' || second == 'i' || 
            second == 'o' || second == 'u') {
        word = word + "ay";
    } else {
        for (int i = 0; i < word.length(); i++) {
        for (int j = 0; j < 5; j++) {
            if (word.charAt(i) == vowel[j]) {
                word = word.substring(i + 1) + word.substring(i) + "ay";
                break;
            }
        }
    }
    return word;
}

【问题讨论】:

  • 怎么了?你有错误吗?你得到错误的输出吗?请帮助我们帮助您。
  • 我没有得到正确的输出。
  • 我应该得到这样的东西,但我什么也没有得到看起来很接近的东西。laptop aptoplay Art Artay string ingstrayelephant egy brinkmanship inkmanshipbray

标签: java string indexing char


【解决方案1】:

首先,您的break 应该跳出两个循环。为此,请在您的第一个循环之前放置一个标志,例如

outerloop:
for (int i = 0; i < word.length(); i++) {

然后用break outerloop;代替break;

第二,

word = word.substring(i + 1) + word.substring(i) + "ay";

不起作用,因为当你找到元音时,你想把它放在前面,所以i + 1应该只是i。然后,“ay”之前的其余子字符串应该是开头的辅音,所以0, i而不是i。总之,这给了

outerloop:
    for (int i = 0; i < word.length(); i++) {
        for (int j = 0; j < 5; j++) {
            if (word.charAt(i) == vowel[j]) {
                word = word.substring(i) + word.substring(0, i) + "ay";
                break outerloop;
            }
        }
    }

【讨论】:

    【解决方案2】:

    只需遍历字符串,直到碰到第一个元音,这将为您提供String.substring() 所需的索引值

    将您的 doStuff() 方法简化为以下内容:

    public static void main(String[] args) throws Exception {
        System.out.println(doStuff("laptop"));
        System.out.println(doStuff("String"));
        System.out.println(doStuff("apple"));
    }
    
    public static String doStuff(String word) {
        String vowels = "aeiouAEIOU";
        for (int i = 0; i < word.length(); i++) {
            if (vowels.contains(""+word.charAt(i))) {
                String prefix = word.substring(0, i);
                String suffix = word.substring(i);
                word = suffix + prefix + "ay";
                break;
            }
        }
        return word;
    }
    

    结果:

    aptoplay
    ingStray
    appleay
    

    【讨论】:

    • 谢谢,这是一个非常好的解决方案。但与我所做的非常不同。我真的从你那里学到了,所以 thx thx thx :-)
    • @mr_ecko 不客气。如果您发现我的回答对您最有帮助,请点击我的回答旁边的复选标记,以便您的问题得到解决。
    • ""+word.charAt(i) 为什么是“”?我发现你的答案是第二个最有帮助的,所以我在下面标记了一个,但你确实帮助了我!!
    • @mr_ecko 因为 String.charAt() 返回一个字符。 String.contains() 需要一个 CharSequence。 "" 是一个空字符串,为其添加字符以成为 String/CharSequence。
    • 是的,我现在明白了。再次感谢你。学习这些东西真的很难:-)
    【解决方案3】:

    检查字符串的长度,检查“aeiou”是否是分割点的字符之一。如果是,则相应地重新附加字符串,否则继续下一个字符。

    String doStuff(string a)
    {
        char c;
        string s = "aeiou" //y?
        int i,l;
        l=a.length();
        for(i = 0;i < l;i++)
        {   
            c=a.charAt(i);
            if(s.contains(c))
            break;
        }
        a=a.substring(i,l)+a.substring(0,i)+"ay";
        return a;
    }
    

    【讨论】:

    • 那么“AEIOU”呢?
    • 这就是我支持你的原因。因为它包括了我没有的东西。 ;)
    【解决方案4】:

    我是新来的,所以不太了解惯例。总之,下面的代码应该可以帮助你实现想要的转换。

    使用元音列表为您提供了“包含”操作,与嵌套循环相比,该操作更易于理解代码。但是在处理方面没有优势。

    在下面的代码中,inp 是输入字符串。

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class piglatin {
        public static void main(String args[]) {
            String[] vowels = new String[] { "A", "a", "E", "e", "I", "i", "O",
                    "o", "U", "u" };
            List<String> vowelList = new ArrayList<String>(Arrays.asList(vowels));
            String inp = "string";
            String returnString = inp;
            for (int i = 0; i < inp.length(); i++) {
                if(vowelList.contains(""+inp.charAt(i))){
                    returnString = inp.substring(i)+inp.substring(0,i)+"ay";
                    break;
                }
            }
            System.out.println(returnString);
        }
    
    }
    

    编辑:没有意识到“.contains”可以与字符串一起使用,也可以由 Shar1er80 完成。现在不是堆栈交换所有关于学习;)

    【讨论】:

      【解决方案5】:
      public static String pigLatin(String origianl){
                  List<Character> vowels = new ArrayList<>(5);
                  vowels.add('a');
                  vowels.add('e');
                  vowels.add('i');
                  vowels.add('o');
                  vowels.add('u');
                  boolean vowelFound;
                  for(int i = 0; i < origianl.length(); i++){
                      if(vowels.contains(origianl.toLowerCase().charAt(i))){
                          String post = origianl.substring(0, i);
                          String pre = origianl.substring(i);
                          return pre + post + "ay";
                      }
                  }
                  return null;
              }
      

      您不必使用该列表。还有很多其他选项(例如在if 语句中使用一堆||)。此外,最好将List 放在方法之外,这样就不需要在每次调用方法时都尽可能地创建它。

      【讨论】:

      • @Adam 打了一个很好的电话。使用String 而不是List 是一个更好的主意。 contains 方法的工作原理相同,但您可以使用 Character.toString(origianl.toLowerCase().charAt(i)) 而不是仅使用 origianl.toLowerCase().charAt(i)
      【解决方案6】:
      char[] ar = new char[] { 'u', 'o', 'i', 'e', 'a' };
              string Word = "Hello";
              int count=0;       
              for (int i = 0; i < Name.Length; i++)
              {
                  for (int j = 0; j < ar.Length; j++)
                  {
                      if (Word[i] == ar[j])
                      {
                          count++;
                          Console.WriteLine("{0},{1}",Word[i], i);
                          break;
                      }
                  }
                  if (count==1)
                  {
      
                      break;
                  }
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 2017-02-23
      • 1970-01-01
      • 2010-11-29
      • 2021-12-19
      • 2011-05-29
      • 1970-01-01
      • 2021-07-29
      • 2018-04-20
      • 2017-10-04
      相关资源
      最近更新 更多