Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查字符串是否包含特定字符的最有效方法_Java_String_Validation - Fatal编程技术网

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

Java 检查字符串是否包含特定字符的最有效方法,java,string,validation,Java,String,Validation,我有一个只应包含特定字符的字符串:{}()[] 我创建了一个validate方法来检查字符串是否包含禁止字符(禁止字符是指所有不是{}()[]) 这是我的密码: private void validate(String string) { char [] charArray = string.toCharArray(); for (Character c : charArray) { if (!"{}()[]".contains(c.toString())){

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

我创建了一个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");
        }
    }
}

我想知道是否有更好的方法来实现这一点,因为我的方法似乎不正确。

如果我采用了您实现这一点的方式,我会亲自修改它,如下所示:

private static void validate(String str) {
    for (char c : str.toCharArray()) {
        if ("{}()[]".indexOf(c) < 0){
            throw new IllegalArgumentException("The string contains forbidden characters");
        }
    }
}
私有静态无效验证(字符串str){
for(字符c:str.toCharArray()){
if(“{}()[]”。indexOf(c)<0){
抛出新的IllegalArgumentException(“字符串包含禁止的字符”);
}
}
}
更改如下:

  • 未为
    char
    数组声明临时变量
  • 使用
    indexOf
    查找字符,而不是将
    c
    转换为
    String
    以使用
    .contains()

  • 在原语
    char
    上循环,因为您不再需要
    toString()

  • 不命名参数
    字符串
    ,因为这可能会导致混淆,不是一种好的做法


注意:
包含
调用
indexOf()
,因此从技术上讲,这也为每次迭代节省了一个方法调用。

我希望这对您有效:我已经将我的代码与您的代码一起添加

我使用了一个正则表达式模式,
\\
转义括号,这在正则表达式中有特殊的含义。并使用字符串匹配方法,尝试将给定的字符串值与给定的reg ex模式匹配。在本例中,正如我们使用的not(!),如果我们将类似
“{}()[]的字符串作为”
,它满足if not条件并打印“not matched”,否则如果我们将类似
“{}()[]”的字符串作为“
”,则将打印案例。您可以通过抛出异常来改变这种方式

私有静态无效验证(字符串)
{
字符串模式=“\\{\\\\\\(\\)\\[\\]”;
如果(!string.matches(模式)){
System.out.println(“不匹配:+字符串);
}
否则{
System.out.println(“数据匹配:+字符串”);
}
char[]charArray=string.toCharArray();
for(字符c:charArray){
如果(!“{}()[]”。包含(c.toString()){
抛出新的IllegalArgumentException(“字符串包含禁止的字符”);
}
}
}
所有括号均为元字符,此处引用:
如果您使用的是Java 8,我建议您使用Stream。 这允许您省略字符串装箱的内容

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");
}
这些数字代表禁止使用的字符,如果需要,您可以将其替换为字符:

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

@安德鲁·托比尔科:你用它测试了什么?我测试了它,它对我来说就像预期的那样工作。@AndrewTobilko我已经用多个测试用例对它进行了测试,对我来说正在工作。也许我错过了something@CristianIacob这篇文章可能更适合代码审查stackexchange,因为它似乎是需要优化/审查的工作代码。我将在for循环外部创建字符串,其中包含“{}()[]”,您也可以使用正则表达式。类似这样的
[{}()[]]
如果你用
{}()[]
创建了一个
集合,它将是一个O(n)解决方案,因为现在最坏的情况是O(n*m)。@michalk我更倾向于回顾他的解决方案,而不是提出一个完全不同的解决方案。