不能比较字符串?

时间:2016-06-18 00:40:04

标签: java android xml string algorithm

这太奇怪了。我只是比较两个相同的字符串,但它们没有正确比较。 text是我从用户对话中提取的字符串(它被修剪):

String compareThis = sharedPrefs.getString("key", "default").toLowerCase().trim();    
if (text.equals(compareThis)){
    Toast.makeText(lol, "Good, strings matched :)", Toast.LENGTH_SHORT).show();
}else{
    Toast.makeText(context, "Should be " +text +" Not " +compareThis, Toast.LENGTH_SHORT).show();
}

现在看,这段代码看起来很简单,但即使字符串相等,条件也会进入else ......现在你想的是因为字符串不相等。不,因为我得到了这个祝酒词:

应该是你好不是你好

什么?!那些是相同的字符串?!吐司甚至表明那些是相同的...如果他们都是“你好”,为什么比较不起作用?

谢谢,

Ruchir

1 个答案:

答案 0 :(得分:1)

这太奇怪了。我只是比较两个字符串,它们是相同的,但它们不是..

你确定它们是相同的字符串???

尝试获取字节并比较它们(按字节)或使用代码点

  try {
         byte[] bytesStr1 = Str1.getBytes("UTF-8");
         byte[] bytesStr2= Str2.getBytes("UTF-8");

        if(bytesStr1.length!=bytesStr.length)log("no match = size");

        for(int b=0;b<bytesStr1.length;b++) {
             if(bytesStr1[b] != bytesStr2[b]) 
                   return log("no match at pos: "+ b);
        }
  } catch (UnsupportedEncodingException e) {
       // handle exception here 
  }

字符串比较失败可能有很多原因 - 例如

  • 空间与不间断空间&lt; - trim将无法帮助您

简单的例子:

 String oldString = "\uD800";
 String newString = new String(oldString);
 String newString = new String(oldString.getBytes("UTF-8"), "UTF-8");
 newString.equals(oldString) // ???? false 

小小的吸引力:

你的大多数人(我的意思是大多数人在这里)问题可以通过阅读和理解基础知识来解决:) - 但你却从大“水”中“淹没”了

  

好的,我尝试了你所说的并逐字逐句,但它们都是一样的。此外,长度是相同的。 - Ruchir Baronia

所以这意味着“在您的定义中”两个字符串都等于

代替比较方法,您可以使用:

int pos =  String.indexOf(String);  //this will return you the firs position where the two strings don't match 
  • 方法实现类似于我在本文开头写的方法
讲座:

https://docs.oracle.com/javase/tutorial/java/data/comparestrings.html

现在,当我们为android编写代码时,我建议特别注意 - 因为google会自行重写大多数java类,Oracle中的字符串类与Google String类不同,因为它们不会在ORACLE JVM上直奔! - 参观ART(Android Runtime) - 每当我访问google&amp;浏览回购我看到google api&amp; amp;中的代码更改android的源代码我看到更多的东西重写在纯c(作为本机) - 谷歌想打破专有的oracle java因此使用更多的开放jdk实现