我试图从句子中找到使用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);
}
答案 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 = 0
,to = 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