检查字符串是否包含特定字符的最高效方法

4

我有一个字符串,它只应包含特定的字符:{}()[]

我创建了一个验证方法来检查字符串是否包含禁止字符(禁止字符指除{}()[]以外的所有字符)

这是我的代码:

private void validate(String string) {

    char [] charArray = string.toCharArray();
    for (Character c : charArray) {
        if (!"{}()[]".contains(c.toString())){
            throw new IllegalArgumentException("The string contains forbidden characters");
        }
    }
}

我想知道是否有更好的方法来做这件事,因为我的方法似乎不正确。

1
@Andrew Tobilko 你测试了什么来使用它?我测试过了,对我来说它的工作符合预期。 - Nexevis
@AndrewTobilko 我已经使用多个测试用例进行了测试,对我来说它是有效的。也许我错过了什么。 - jennifer lawrence
4
@Cristian Iacob 这篇文章可能更适合发布在代码审查的StackExchange社区,因为它看起来是您想要优化/审查的工作代码。 - Nexevis
我会在循环外创建一个包含“{}()[]”的字符串。 - Rafał Sokalski
1
你也可以使用 正则表达式。类似于这样 [{}()[]] - Qui-Gon Jinn
3个回答

4

如果按照你实现的方式,我个人会进行如下修改:

private static void validate(String str) {
    for (char c : str.toCharArray()) {
        if ("{}()[]".indexOf(c) < 0){
            throw new IllegalArgumentException("The string contains forbidden characters");
        }
    }
}

以下是更改内容:
  • 不为 char 数组声明临时变量。
  • 使用 indexOf 查找字符,而不是将 c 转换为 String 并使用 .contains()

  • 循环遍历原始的 char,因此您不再需要使用 toString()

  • 不要将参数命名为 string,因为这可能会导致混淆,也不是一个好的做法。

注意:contains 调用 indexOf(),因此在每次迭代中,这确实也可以帮助您节省一个方法调用。


如果您将{}()[]符号创建为一个Set,则目前的最坏情况时间复杂度为O(n * m),但使用Set后可以优化为O(n)。 - Michał Krzywański
@michalk 我更倾向于审查他的解决方案,而不是提出完全不同的解决方案。 - Nexevis

2
我建议如果你使用Java 8,可以使用Stream。这样可以避免将char转换为String的问题。
private void validate_stream(String str) {
        if(str.chars().anyMatch(a -> a==125||a==123||a==93||a==91||a==41||a==40))
            throw new IllegalArgumentException("The string contains forbidden characters");
}

数字是禁止字符的 ASCII 码,如果需要可以用字符替换它们:
(a -> a=='{'||a=='}'||a=='['||a==']'||a=='('||a==')')

-1
希望这对您有用:我已经将我的代码与您的代码一起添加了。
我使用了一个正则表达式模式,其中\\转义括号,在正则表达式中具有特殊含义。并且使用字符串的matches方法,它尝试将给定的字符串值与给定的正则表达式模式匹配。在这种情况下,由于我们使用了not(!),如果我们提供像"{}()[]as"这样的字符串,则满足if not条件并打印“not matched”,否则如果我们提供像"{}()[]"这样的字符串,则会打印else语句。您可以通过抛出异常来更改此设置。
private static void validate(String string)
{

    String pattern = "\\{\\}\\(\\)\\[\\]";
    if(!string.matches(pattern)) {
        System.out.println("not matched:"+string);
    }
    else {
        System.out.println("data matched:"+string);
    }
    char [] charArray = string.toCharArray();
    for (Character c : charArray) {
        if (!"{}()[]".contains(c.toString())){
            throw new IllegalArgumentException("The string contains forbidden characters");
        }
    }
}

所有的括号都是元字符,在这里引用: http://tutorials.jenkov.com/java-regex/index.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接