什么';评估大量Java字符串比较条件的一种更优雅的方式是什么?

什么';评估大量Java字符串比较条件的一种更优雅的方式是什么?,java,string,comparison,Java,String,Comparison,我已经为我的应用程序中的一个功能编写了以下字符串比较操作 但我讨厌它的样子和它的笨拙 String foo = "abc"; if(!foo.startsWith("ba") && !foo.equals("cab") && !foo.equals("bca") && !foo.equals("bbc") && !foo.equals("ccb") && !foo.

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

但我讨厌它的样子和它的笨拙

String foo = "abc";

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

有没有一种更优雅、更易于维护的方式来编写类似的内容?

您可以使用正则表达式

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

String foo = "abc";
if (!P.matcher(foo).matches())
正则表达式(理想情况下)或if/else块。下面是对Java正则表达式的温和介绍:


如果在代码中只有一次这种情况,我会让它变成这样。如果多次使用,请初始化一个常量集:

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)) {
    ...
}
private static final Set STRINGS\u TO\u AVOID=
Collections.unmodifiableSet(新哈希集(Arrays.asList(“cab”、“bca”、“bbc”、“ccb”、“cca”)));
...
如果(!foo.startsWith(“ba”)&&!STRINGS\u TO\u AVOID.contains(foo)){
...
}

在您的示例中,您可以使用哈希集来放置所有要比较的字符串

然后你可以简单地打字

 if (!foo.startsWith("ba") && !mySet.contains(foo)) { 
    //doSomething
 }
  • 编辑:该死。。。我要迟到了。。。有人打了我
有人可能会说,下面这样的代码比原始代码更“优雅”

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

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

你可以使用正则表达式,但你仍然需要在正则表达式中包含所有条件…如果你想拥有很多条件,你可能想将其分解为自己的方法,除此之外,我认为你没有很多优雅的选择。你需要
^
和/或
$
在那里的某个地方吗<代码>“aba”应该是合法的,但将由
ba.
部分进行匹配。@dlev,从Javadoc
中,matches方法尝试根据模式匹配整个输入序列。
因此
aba
将不会由
ba.
@dlev,即
find()
按照您的建议执行,如果需要,您必须添加
^
$
。(或使用matches())我认为在一个“if”语句中超过两个或三个布尔表达式都是一种讽刺。“matches()”是非常非常优秀的!“它也更高效。”paulsm4,在我的计算机上,最初的示例需要16832纳秒来匹配,而正则表达式示例需要2727022纳秒。如果首先编译模式,需要86044纳秒。你仍然相信regex是非常非常优秀和高效的吗?我不这么认为。顺便说一句,避免刺痛的方法需要32896纳秒。此外,我问了我的女朋友(她不喜欢编程),她同意原来的例子更容易理解。。。