.equals()的问题

Makaires

以下是我正在使用的代码的一小部分,以及我正在使用的文本文件的语法。(我很确定两者都过于复杂,但是我不确定如何简化它们。)

        while((line = bufferedReader.readLine()) != null) 
        {

            if(line.split("@@")[0].equals(lineNumber))
            {
                numberOfLines = Integer.parseInt(line.split("@@")[1]);
                spaceSkip = 1;
                worked = 0;
            }

            if(spaceSkip == 0)
            {
                if(numberOfLines > 0)
                {
                    System.out.println(line);
                    numberOfLines--;
                }
            }

            spaceSkip = 0;
        }

文本文件的格式为:1 @@ 2 @@ 3 @@ 0文本位于其下方,并且可以跨越多行。

3和0在这里不起作用。程序的目的是搜索所选的数字并将其与第一个数字(在这种情况下为1)匹配。第二个数字是要读取的行数。在代码中,我有“ spaceSkip”,因此它不读取索引行。

除了解释,我遇到的问题line.split("@@")[0].equals(lineNumber)似乎是读错了。我同时将它们都打印到屏幕上,并且都等于1,但是它仍然返回我包含的错误消息。(“ worked = 0;”是阻止错误触发的原因。)我敢肯定,这是我在这里犯的一个愚蠢的简单错误,但我仍然无法弄清楚。先感谢您。

内森·休斯(Nathan Hughes)

每当比较未返回您认为应该的结果时,请检查类型是否符合您的想法。

String#split返回一个字符串数组。对于给定的输入,该数组的第一个元素将为“ 1”。如果lineNumber不是字符串,例如int,则equals仍然有效(原始int自动装箱到java.lang.Integer,这是java.lang.Object的子类,equals方法的类型用作参数),但比较("1".equals(1))始终返回false。JavaScript可以用字符串和int相等("1" == 1返回true),但Java不行。

最简单的解决方法是,通过传入lineNumber来调用String#valueOf,将lineNumber转换为String。将lineNumber转换为String而不是尝试将拆分输出转换为Integer会更好,因为在输入错误的情况下Integer解析可能会失败,而我宁愿避免必须管理这种可能性。

不幸的是,拆分调用的cut-n-pasting主要是因为冗余,您应该将拆分一次分解为一个局部变量,例如:

String[] parts = line.split("@@");
if (parts[0].equals("1")) {
    numberOfLines = Integer.parseInt(parts[1]);
    ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章