我正在研究一种方法,该方法以小写字母的形式获取字符串和三个字母的数组作为输入。
该方法应该找到以第一个字母开头的单词,并按插入顺序包含其他两个字母。
如果插入两次字母,它应该在单词中出现两次。
例如,expected
一词是(e,e,e)
的合法用语,但seemed
这个词不合法。
使用我的以下代码,我可以获得任何合法的输入,这是错误的。
public static void printWords(String[] vocabulary,
String firstLetter, String secondLetter, String thirdLetter){
int counter=0;
for (String str : vocabulary){
int index1=0;
int index2=0;
String newstr=str;
if (((str.substring(0,1).equals(firstLetter)))){
newstr=str.substring(1, str.length());
if (newstr.contains(secondLetter)){
index1=str.indexOf(secondLetter);
newstr=str.substring(index2, str.length());
}
if (newstr.contains(thirdLetter)){
index2=str.indexOf(thirdLetter);
}
}
if (index2>index1)
{
counter++;
System.out.println(str);
}
}
System.out.println("found "+ counter+" words");
}
答案 0 :(得分:3)
使用正则表达式实现起来要容易得多:
boolean matches(String word, String letter1, String letter2, String letter3) throws IllegalArgumentException {
String[] s = new String[] {letter1, letter2, letter3};
for (String l : s) {
if (l.length() != 1)
throw new IllegalArgumentException("Wrong input, only 1-char strings are allowed!");
if (l < "a" || l > "z")
throw new IllegalArgumentException("Wrong input, only lowercase latin letters are allowed!");
}
Pattern regex = Pattern.compile(s[0] + ".*" + s[1] + ".*" + s[2] + ".*");
// will produce a regex like "a.*b.*c.*"
return regex.matcher(word).matches();
}
答案 1 :(得分:3)
如果你严格地谈论给定的代码(虽然正则表达式或其他一些方式更优雅和更好的解决方案)应该是:
if (((str.substring(0,1).equals(firstLetter)))){
newstr=str.substring(1, str.length());
if (newstr.contains(secondLetter)){
index1=newstr.indexOf(secondLetter) + 1;
newstr=str.substring(index1 + 1, str.length());
}
if (newstr.contains(thirdLetter)){
index2=newstr.indexOf(thirdLetter) + index1 + 1;
}
....