计算两个辅音之间的元音

时间:2014-03-19 12:10:21

标签: java string

我试图从句子中找到使用java在两个r之间包含两个元音的单词。所以我在句子中读到,然后我必须找到符合上述标准的单词。例如,如果我有一个字符串,如:“咆哮足球名单阅读器”,方法matches应该返回true单词“roar”和“roster”

这是我提出的方法,即做这项工作

public boolean matches(String singleWord)
{
    // set count to -1. it will increase to 2 if a 'r' is found, it decreases for each vowel    
    int count = -1;
    // loop through a single word
    for (int i=0; i<singleWord.length(); i++){
        // if a 'r' is found set the count to two
        if(singleWord.charAt(i) == 'r'){
            // when count it's 0 exit loop
            if (count == 0)
                return true;
            count = 2;}
        // if I find a vowel count decreases
        else if(isVowel(singleWord.charAt(i))){
            count--;}
    }
    return false;
}

但它看起来有点笨拙......关于如何改进它或使其更简单的任何建议?感谢名单!!!

以防万一,这是isVowel方法

  private boolean isVowel(char c)
{
    String s = c + "";
    return "aeiou".contains(s);
}

3 个答案:

答案 0 :(得分:3)

您可以使用没有循环的直接算法来执行此操作:

  • 找到第一个'r'
  • 的索引
  • 查找上一个'r'
  • 的索引
  • 剪切两个
  • 之间的子字符串
  • 如果从子字符串中删除所有元音,则返回true,至少缩短两个字符。

以下是如何实施它:

boolean matches(String singleWord) {
    int from  = singleWord.indexOf('r');
    int to = singleWord.lastIndexOf('r');
    if (from < 0 || from == to) return false;
    String sub = singleWord.substring(from+1, to);
    return (sub.length() - sub.replaceAll("[aeiou]", "").length()) == 2;
}

以下是一步一步的工作方式,使用单词"roadster"作为示例:

  • from = 0to = 7
  • sub = "oadste";长度是6
  • 替换后的
  • sub"dst";长度是3
  • 表达式(6 - 3) == 2为3,而不是2,因此返回false

编辑:序列必须包含两个元音,没有插入'r'个。

这会使问题略有不同,因为第一个和最后一个索引的技巧不再适用。但是,可以相对容易地构建匹配所需序列的正则表达式 - 这里是:

"r[^raeiou]*[aeiou][^raeiou]*[aeiou][^raeiou]*r"

为了理解这个正则表达式,您需要知道的是[...]匹配括号内的任何字符,[^...]匹配除括号中的字符以外的任何字符,并且*匹配在子表达式之前零次或多次。

表达很冗长,但它由琐碎的部分组成。它符合以下内容:

  • 初始r
  • r
  • 以外的零个或多个非元音
  • 第一个元音
  • r
  • 以外的零个或多个非元音
  • 第二个元音
  • r
  • 以外的零个或多个非元音
  • 结束r

这是一个简单的实现:

boolean matches(String singleWord) {
    return singleWord
        .replaceAll("r[^raeiou]*[aeiou][^raeiou]*[aeiou][^raeiou]*r", "")
        .length() != singleWord.length();
}

答案 1 :(得分:2)

您还可以使用正则表达式:

java.util.regex.Pattern.matches("\w*r\w*([aeiou]\w*){2}r\w*", "roar soccer roster reader");

答案 2 :(得分:2)

您可以使用正则表达式:

public static boolean matches(final String singleWord) {
    return singleWord.matches(".*r([^aeiour]*[aeiou]){2}[^aeiour]*r.*");
}

这是测试代码:

for (String word: "roar soccer roster reader rarar".split(" "))
    System.out.println(word+":"+matches(word));

这是输出:

roar:true
soccer:false
roster:true
reader:false
rarar:false