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