.equals() 问题

Issue with .equals()

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

        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;" 是阻止错误触发的原因。)我确信这是我在这里犯的一个愚蠢的简单错误,但我仍然无法弄清楚。提前谢谢你。

如果没有看到变量的初始化,很难判断,但您可能在此 if 语句中将字符串与整数进行比较。 您可能想尝试将第二个参数转换为字符串,如下所示。

if(line.split("@@")[0].equals(String.valueOf(lineNumber)))

只要比较不符合您的想法return,请检查类型是否符合您的想法。

String#split returns 一个字符串数组。对于您给定的输入,该数组的第一个元素将为“1”。如果 lineNumber 不是字符串,比如 int,那么 equals 仍然有效(原始 int 被自动装箱为 java.lang.Integer,它是 java.lang.Object 的子类,它是 equals 方法的类型作为参数),但比较 ("1".equals(1)) 将始终 return false。 Java脚本可以将字符串和整数等同起来("1" == 1 return 正确),但 Java 不是。

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

split 调用的剪切-n-粘贴很不幸,主要是因为冗余,您应该将 split 一次到局部变量中,例如:

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