评估大量Java字符串比较条件的风格更优雅的方法是什么?

时间:2011-08-29 19:10:58

标签: java string comparison

我已经为我的应用中的功能编写了以下字符串比较操作。

但是我讨厌它看起来的方式以及它是多么笨拙。

String foo = "abc";

if(!foo.startsWith("ba") && 
    !foo.equals("cab") && 
    !foo.equals("bca") && 
    !foo.equals("bbc") && 
    !foo.equals("ccb") && 
    !foo.equals("cca"))
{
    // do something
}

是否有更优雅,更可维护的方式来写这样的东西?

5 个答案:

答案 0 :(得分:7)

您可以使用正则表达式。

private static final Pattern P = Pattern.compile(
                                 "(ba.*|cab|bca|bbc|ccb|cca)");

String foo = "abc";
if (!P.matcher(foo).matches())

答案 1 :(得分:6)

如果您的代码中只有一次这样的条件,我会这样做。如果你有几次,请初始化一个常量集:

private static final Set<String> STRINGS_TO_AVOID = 
    Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("cab", "bca", "bbc", "ccb", "cca")));

...

if (!foo.startsWith("ba") && !STRINGS_TO_AVOID.contains(foo)) {
    ...
}

答案 2 :(得分:0)

正则表达式(理想情况下)或if / else块。这是对Java正则表达式的温和介绍:

http://www.javamex.com/tutorials/regular_expressions/

答案 3 :(得分:0)

使用您的示例,您可以使用HashSet来放置您想要比较的所有字符串。

然后你可以简单地输入

 if (!foo.startsWith("ba") && !mySet.contains(foo)) { 
    //doSomething
 }
  • 编辑:Dang ......我迟到了......别人打败了我。 ; - )

答案 4 :(得分:0)

有人可能会争辩说,以下内容比原始代码更“优雅”。

if (!foo.matches("^ba.*|^cab$|^bca$|^bbc$|^ccb$|^cca$")) {
  // do something
}

我更喜欢原版,因为它最简单,使用任何人都能理解的自然语言,因此它更易于维护......