字符串的equals方法对我不起作用

6

这是有用的代码部分:

java.util.List<Element> elems = src.getAllElements();
Iterator it = elems.iterator();
Element el;
String key,value,date="",place="";
String [] data;
int k=0;
Segment content;
String contentstr;
String classname;

while(it.hasNext()){

    el = (Element)it.next();

    if(el.getName().equals("span"))
    {

            classname=el.getAttributeValue("class");
        if(classname.equals("edit_body"))
        {
            //java.util.List<Element> elemsinner = el.getChildElements();
            //Iterator itinner = elemsinner.iterator();


            content=el.getContent();

            contentstr=content.toString();


            if(true)
            {


                System.out.println("Done!");

                System.out.println(classname);

                System.out.println(contentstr);


            }
       }
    }

}

没有任何输出。但是如果我删除 if(classname.equals("edit_body")) 条件,它会在其中一个迭代中打印:

Done!
edit_body
&quot;I honestly think it is better to be a failure at something you love than to be a success at something you hate.&quot;

我无法理解bug的部分...请帮忙!

顺便说一下,我正在使用一个外部的Java库来解析HTML。

另外,在输出的开头有两个错误,这两种情况都存在,无论是否使用if条件语句。

Dec 20, 2012 11:53:11 AM net.htmlparser.jericho.LoggerProviderJava$JavaLogger error SEVERE: EndTag br at (r1992,c60,p94048) not recognised as type '/normal' because its name and closing delimiter are separated by characters other than white space 

Dec 20, 2012 11:53:11 AM net.htmlparser.jericho.LoggerProviderJava$JavaLogger error SEVERE: Encountered possible EndTag at (r1992,c60,p94048) whose content does not match a registered EndTagType 

希望这不会引起错误。

好的,大家,请有人给我解释一下!"edit_body".equals(el.getAttributeValue("class")) 这个代码有效!!


3
执行System.out.println(el.getName()) - Raekye
它的输出结果是跨度,这不应该是这样的。 - arkanath
当然,如果我删除给定的“if”条件,src.getAllElements会正常工作并输出迭代器。getName()会以字符串形式返回标签的名称...http://jericho.htmlparser.net/docs/javadoc/index.html很明显,我不认为equals方法有问题或JAVA API有问题,否则我就不会寻求您的帮助了。问题的标题是我能想到的最接近的短语! - arkanath
我从来没有遇到过这个问题,但是尝试将两个字符串转换为相同的字符集?http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes(java.lang.String) 然后比较字节数组。 - Raekye
好的伙计们!!!有人能解释一下吗?"edit_body".equals(el.getAttributeValue("class")) 行了!!BAZINGA!! - arkanath
显示剩余2条评论
5个回答

17

我现在遇到了完全相同的问题。

我成功地解决了这个问题,方法是使用:SomeStringVar.replaceAll("\\P{Print}","");

这个命令会删除变量中的所有Unicode字符(那些你看不到的字符——即使两个字符串看起来相等,它们实际上并不相等)。

我在需要进行比较的每个变量上都使用了这个命令,它也为我解决了问题。


1
太棒了!这正是我现在代码所缺少的...谢谢! - Fernanda Brum Lousada

13

看起来你的 classname 中有 前导尾随空格字符

尝试使用这个:-

if(classname.trim().equals("edit_body"))

这将修剪掉末尾的任何空格。


@Arkanath.. 嗯,现在这很奇怪。请展示您正在尝试解析的HTML部分。只需要包含该文本的部分即可。 - Rohit Jain
@Arkanath。在比较之前,您也可以执行:- classname.replaceAll("\\p{C}", ""); - Rohit Jain
尝试了 classname.replaceAll("[^\\x20-\\x7e]", "")classname.replaceAll("\\p{C}", ""),都没用.. 真的很烦恼 :) 非常奇怪! - arkanath
@Arkanath.. 什么??哇,这太奇怪了。我的意思是,这真的像是违反规则。如果当然它们都不是“null”,s1.equals(s2)应该给出与s2.equals(s1)相同的结果。这是equals方法的合同之一。我现在更惊讶的是真正的问题是什么。 - Rohit Jain
@Arkanath.. 啊!算了吧。假装你从没遇到过这种情况,因为这种行为是出乎意料的。不知道为什么会发生这种情况。不管怎样,你完成了工作,就这样。 - Rohit Jain
显示剩余16条评论

2
首先,String.equals() 并没有出现问题。它对于数百万个其他程序/程序员都能正常工作。除非你或某个人故意修改并破坏了你的Java安装,否则这不是你遇到问题的原因。
那么为什么两个表面上相等的字符串会比较为不等呢?
有以下几种可能:
1. 字符串中可能包含前导或尾随的空格字符。 2. 字符串中可能包含嵌入的不可打印字符。 3. 字符串中可能包含一些Unicode字符对,这些字符在使用典型字体显示时看起来相同,但实际上不同。例如,希腊代码页包含一些看起来像拉丁元音字母的字符......但实际上是不同的代码,因此它们不相等。

2
我说过String.equals()有问题吗?我是说它不起作用,也就是对我没用!无论如何,你可以解释一下这个:"edit_body".equals(el.getAttributeValue("class")) 起作用了! - arkanath
听起来像是我的情况#3。具体来说,你的代码版本中不工作的那个有一个嵌入在源代码中的“看起来像拉丁字母但实际上不是”的字符。或者它可能在网页中(虽然这似乎不太可能,因为你已经让新版本的代码工作了)。 - Stephen C
不工作 == 坏掉了。 对我不起作用 != 不工作。 我毫不怀疑 String.equals 方法正按照规定的方式工作,你得到的结果正是规范指定的。 问题在于你使用它的方式。 你只需要在调试问题时进行"取证式"的方式即可。 - Stephen C
是的,这就是重点,新版本发生了什么?我觉得这很惊讶! - arkanath
请阅读我写的内容...我已经解释了(现在已经是第二次!!)看起来是根本原因。我不知道你如何将“奇怪”的字符输入到你的源代码中... - Stephen C
显示剩余2条评论

0

将代码更改为:

classname="edit_body"; //<- hardcode 

if(classname.equals("edit_body"))

如果代码现在进入了if语句,那么当您使用原始的“classname=el.getAttributeValue(“class”);”时,字符串内容肯定有所不同。在这种情况下,循环遍历各个字符并进行比较以找到差异。

如果代码仍然没有进入if语句,则要么您的代码没有编译,而您正在运行旧代码,要么您的Java安装已损坏;-)

或者。

如果Java与.NET类似(我不知道Java),那么“el.getAttributeValue”是否被输入为字符串?如果它被输入为对象,则if语句将不会进入,因为它们是相同字符串的两个不同实例。


0

equals() 是 String 类的一个方法。因此,它只能使用双引号。

 if(someString.equals("something")) ✓
 if(someString.equals('something')) ×

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接