用for循环(Java)替换if语句

用for循环(Java)替换if语句,java,string,methods,Java,String,Methods,我正在做一个项目,我收到的一条评论是我的if语句太长了。我同意这一点,但我仍然对如何用建议的for循环替换它感到困惑。这让我快发疯了。该项目的目的是分析句子中的辅音,如果辅音在句子中,则报告。这是我使用的代码。该项目已被标记,因此这更像是一个“我的错误在哪里/这个问题在哪里可以改进” if((userInput.contains(“b”))||(userInput.contains(“c”))|(userInput.contains(“d”))|| (userInput.contains(“f”

我正在做一个项目,我收到的一条评论是我的if语句太长了。我同意这一点,但我仍然对如何用建议的for循环替换它感到困惑。这让我快发疯了。该项目的目的是分析句子中的辅音,如果辅音在句子中,则报告。这是我使用的代码。该项目已被标记,因此这更像是一个“我的错误在哪里/这个问题在哪里可以改进”

if((userInput.contains(“b”))||(userInput.contains(“c”))|(userInput.contains(“d”))||
(userInput.contains(“f”)| |(userInput.contains(“g”))| |(userInput.contains(“h”))||
(userInput.contains(“j”)| |(userInput.contains(“k”))| |(userInput.contains(“l”))||
(userInput.contains(“m”)| |(userInput.contains(“n”))| |(userInput.contains(“p”))||
(userInput.contains(“q”)| |(userInput.contains(“r”))| |(userInput.contains(“s”))||
(userInput.contains(“t”))| |(userInput.contains(“v”))| |(userInput.contains(“w”))||
(userInput.contains(“x”)| |(userInput.contains(“y”))| |(userInput.contains(“z”))
//检查辅音
结果+=“输入包含辅音”;
其他的
结果+=“输入不包含辅音”;

您可以创建一个辅音数组(可能作为类的静态常量),并使用一个函数来完成这项工作,类似于(此处的伪代码)

那你就给我打个简单的电话

if (hasConsonants(userInput))
    results += "The input contains consonants";
else
    results += "The input contains no consonants";

另外,最好将
辅音
数组设置为
char[]
,并在for each循环中使用
char
而不是
String
,要使用
for
循环,可以执行以下操作:

for (char c = 'b'; c <= 'z'; c++) {
    if (c == 'e' || c == 'i' || c == 'o' || c == 'u')
        continue;
    if (userInput.contains(String.valueOf(c))) {
        return "The input contains consonants";
    }
}
return "The input contains no consonants";

为什么不这样做呢

private String[] mCharacters = new String[] { "a", "b", "c" };

public boolean hasSelectedCharacters(String str) {
    for (final String c : mCharacters) {
        if (str.contains(c)) {
            return true;
        }
    }
    return false;
}

如果输入字符串包含列出的任何字符串,则返回true,否则返回false。与长If相同,但可读性更高。

为什么不使用类似于:

if(java.util.regex.Pattern.compile("(?i)[b-df-hj-np-tv-z]").matcher(line).find())
    System.out.println("Contains consonants");

使用正则表达式,例如:

if (userInput.matches (".*[bcdfghjklmnpqrstvwx]+.*"))
    results += "has consonants";
else
    results += "no consonants";
如果您可以确保不使用任何符号,则更简单的版本为:

if (!userInput.matches (".*[aeiou]+.*"))
    results += "has consonants";
else
    results += "no consonants";
if (userInput.matches(".*[bcdfghjklmnpqrstvwxyz].*"))
   results += "The input contains consonants";
else 
   results += "The input contains no consonants";
调整以适合区分大小写。

char[]辅音=“bcdfghkjllmnpqrstvwxyz”。tocharray();
char[] consonants = "bcdfghkjlmnpqrstvwxyz".toCharArray();
results = "The input contains no consonants";

for (int i = 0; i < consonants.length; i++)
    if (userinput.contains(String.valueOf(consonants[i])))
        results = "The input contains consonants";
结果=“输入不包含辅音”; for(int i=0;i
好的,是时候学习正则表达式或正则表达式了。因此,you if语句将是:

if (!userInput.matches (".*[aeiou]+.*"))
    results += "has consonants";
else
    results += "no consonants";
if (userInput.matches(".*[bcdfghjklmnpqrstvwxyz].*"))
   results += "The input contains consonants";
else 
   results += "The input contains no consonants";

如需了解更多信息,请阅读本教程

,它将更加高效且可读

if(Pattern.matches("[b-df-hj-np-tv-z]+",userInput)){  
    ----code----
}
else{
    ----other code----  
}

下面是我如何将其作为循环编写的(我假设您的字符串已经小写):

下面是使用正则表达式的另一种方法:

private static final Pattern consonantPattern =
    Pattern.compile("[a-z&&[^aeiou]]");
public static boolean containsConsonants(String s) {
    return consonantPattern.matcher(s).find();
}

您可能应该在Use和regular expression上发布这篇文章。您还可以检查它是否是vowel@Leo对于只包含元音的字符串和既不是元音也不是辅音的字符(如空格和特殊字符)@Gorkk[A-Za-z]减去元音
boolean hassconsonates(String userInput)
:)的字符串,这将给出假阳性,修复这个问题(从伪代码开始,然后一路上让java变得更加正确,遗漏了一些东西;)是的,这绝对是最好的,但我的印象是OP想要一个
for
循环。+1,因为OP问到如何改善他的状况,使用循环只是一个建议(可能不是最好的建议)。在这里使用模式确实要优雅得多(如果这和op ofc中的“使用for循环”部分配合使用的话)。可能使用不区分大小写的匹配。最喜欢的答案是,它不需要手动构建辅音字母表(仅元音),而且它还使用了对初学者友好的结构(OP特别询问了如何使用
for
循环)。第一部分很好,通过
userInput.matches(“.[aeiou]+.*”)
意思是“没有辅音”?
*
可能已经满了。对不起,它还是错的。如果检查为true,字符串也可能为空,如果检查失败,字符串可能同时包含辅音和人声。而且,三重否定让我头晕目眩。嗯,最好还是坚持第一个版本。它可能还有几个字符,但要简单得多。你试过这个吗
matches
要求整个字符串与正则表达式匹配,也就是说,这将只匹配单个辅音的字符串。@xlm和tobia_k你们说得对,我忘记了前后的。*。已更新。我更希望所选字符作为附加参数传递给
hasSelectedcharacters
,而不是在字段中。
private static final Pattern consonantPattern =
    Pattern.compile("[a-z&&[^aeiou]]");
public static boolean containsConsonants(String s) {
    return consonantPattern.matcher(s).find();
}