【问题标题】:most efficient way to check if a string contains specific characters检查字符串是否包含特定字符的最有效方法
【发布时间】:2020-01-19 12:18:57
【问题描述】:

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

我创建了一个 validate 方法来检查字符串是否包含禁止字符(禁止字符是指所有不是 {}()[] 的内容)

这是我的代码:

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");
        }
    }
}

我想知道是否有更好的方法可以做到这一点,因为我的方法似乎不正确。

【问题讨论】:

  • @Andrew Tobilko 你用它测试了什么?我对其进行了测试,它按预期工作。
  • @AndrewTobilko 我已经用多个测试用例对其进行了测试,并且对我来说正在工作。也许我错过了什么
  • @Cristian Iacob 这篇文章可能更适合代码审查 stackexchange,因为它似乎是您想要优化/审查的工作代码。
  • 我会在 for 循环外创建包含“{}()[]”的字符串
  • 您也可以使用 Regex。像这样[{}()[]]

标签: java string validation


【解决方案1】:

如果我采用你的实现方式,我会亲自修改如下:

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) 的解决方案,而现在最坏的情况是O(n * m)。
  • @michalk 我更倾向于回顾他的解决方案,而不是想出一个完全不同的解决方案。
【解决方案2】:

如果您使用的是 Java 8,我建议您使用 Stream。 这允许您将 char 省略为字符串装箱内容。

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 codes 表示禁用字符,如果需要,您可以将它们替换为字符:

(a -> a=='{'||a=='}'||a=='['||a==']'||a=='('||a==')')

【讨论】:

    【解决方案3】:

    我希望这对你有用:我已将我的代码与你的代码一起添加。

    我使用了一个正则表达式模式,其中\\ 转义括号,这在正则表达式中有特殊含义。并使用字符串的matches方法,它尝试将给定的字符串值与给定的reg ex模式匹配。在这种情况下,由于我们使用了 not(!),如果我们给出类似 "{}()[]as" 的字符串,它满足 if not 条件并打印“不匹配”,否则如果我们给出类似 "{}()[]" 的字符串,否则将打印大小写。你可以通过抛出异常来改变你喜欢的方式。

    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

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多