什么';评估大量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纳秒。此外,我问了我的女朋友(她不喜欢编程),她同意原来的例子更容易理解。。。