为什么不等于将我的变量识别为与传递它的字符串相同的字符串?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不等于将我的变量识别为与传递它的字符串相同的字符串?相关的知识,希望对你有一定的参考价值。

因此,这个小功能应该检查括号和方括号是否彼此匹配。我觉得它应该可以工作,我尝试了几种不同的方法,但是我不知道如何检查我的下一个字符是否符合我的期望。

class Parenths {
    public boolean isValid(String s) {
        char[] parens = s.toCharArray();
        if (parens.length == 0) return true;
        for (int i = 0; i < parens.length; i+=2) {
            String curr= String.valueOf(parens[i]);
            String next = String.valueOf(parens[i+1]);
            // System.out.println(next.equals(")");      --------> false
            // System.out.println(Object.equals(next, ")")); ----> error
            switch (curr) {
                case "(": if (!next.equals(")")) return false;
                case "{": if (!next.equals("}")) return false;
                case "[": if (!next.equals("]")) return false;       
            }
        }
        return true;
    }
}

[您可以看到我打印出的要调试的行,似乎.equals不是在这里使用的正确方法吗?谁能解释为什么这行不通?

PS。我意识到我不必将字符串转换为char数组来比较元素,因此除非是唯一的解决方法,否则请不要对我指出。

答案

未经测试,但这似乎是一个失败的问题。 尝试用if (boolean) return boolean替换return boolean,这可以解决问题。

问题是,案例末尾没有break,因此,例如,如果您的第一个案例为true,它将不会停止执行并执行第二个测试,这将为false。如果将条件语句更改为直接返回,则不会出现此问题。

编辑:对不起,我读得太快了。这样做会打破循环。实际上,您必须在案例末尾添加break

                case "(": if (!next.equals(")")) return false; break;
                case "{": if (!next.equals("}")) return false; break;
                case "[": if (!next.equals("]")) return false; break;

另一答案

首先,您必须在案例重要之后添加break;以停止查看案例

 switch (curr) {
            case "(": if (!next.equals(")")) return false;
            break;
            case "{": if (!next.equals("}")) return false;
            break;
            case "[": if (!next.equals("]")) return false;   
            break;
        }

第二,您的代码最初不支持封闭专利的混淆,您必须添加默认案例

           switch (curr) {
                case "(": if (!next.equals(")")) return false;
                break;
                case "{": if (!next.equals("}")) return false;
                break;
                case "[": if (!next.equals("]")) return false;    
                break;
                default :
                    break;
            }
            return true;

而且,在与下一个元素进行比较之前,必须确保下一个元素不为null,并且不要以2递增,为String提供一个元素,这就是为什么会出现错误的原因

public static boolean isValid(String s) {
        char[] parens = s.toCharArray();
        if (parens.length == 0) return true;
        for (int i = 0; i < parens.length; i++) {
            String curr= String.valueOf(parens[i]);
            String next = "";
            try { 
            next = String.valueOf(parens[i+1]); 

            switch (curr) {
                case "(": if (!next.equals(")")) return false;
                break;
                case "{": if (!next.equals("}")) return false;
                break;
                case "[": if (!next.equals("]")) return false;    
                break;
                default :
                    break;
            }
            return true;
        }catch(Exception e) {}
            }
        return false;
    }

  • Test:

      System.out.println(isValid("()"));
      // Output : true
      System.out.println(isValid("("));
      // Output : false
    

以上是关于为什么不等于将我的变量识别为与传递它的字符串相同的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以让表格将我的 REGEXEXTRACT 结果识别为日期?

Alamofire 无法将结果识别为 JSON

为啥 Qt::mightBeRichText() 不能将 HTML 表格标签识别为富文本?

防止 PetaPoco 将变量识别为输入参数

Perl 将字符串识别为标量变量

BeautifulSoup - 亚马逊和谷歌将我识别为机器人;我该如何解决?