【问题标题】:Cant compare strings? [closed]不能比较字符串? [关闭]
【发布时间】:2016-06-18 00:40:04
【问题描述】:

这非常奇怪。我只是比较两个相同的字符串,但它们没有正确比较。 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,即使字符串相等...现在你认为那是因为字符串不相等。不,因为我得到了这个吐司:

应该是你好 不是你好

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

谢谢,

鲁基尔

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?这可能会为双方节省大量时间和精力。
  • 试试if (text.trim().equals(compareThis))
  • 我感觉您没有向我们展示一些重要的代码。这是不可重现的。
  • 什么是文本类型?

标签: java android xml string algorithm


【解决方案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 
  }

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

  • 空格 vs. 非中断空格

简单示例:

 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 的 String 类与 Google String 类不同,因为它们没有不要直接在 ORACLE JVM 上运行!!! - 见 ART (Android Runtime) - 每次我访问 google 并浏览 repos 时,我都会看到 google api 和 android 源代码中的代码更改,我看到更多的东西用纯 c 重写(作为本机) - google 想要打破专有因此,oracle java 使用了更多的开放 jdk 实现

【讨论】:

  • 现在您的答案看起来不像是答案,而更像是要求澄清,并提供如何查看潜在问题的建议。要使其成为正确的答案,您可以使用类似 "If equals 返回 false 那么这意味着比较的字符串不相等,即使它们看起来相等。这可能有很多原因。大多数时间问题是其中一个字符串包含不可打印的字符,或者您被空格包围(因此您需要先修剪它们)。要查看是什么情况,您可以使用此代码比较它们的字节
  • @Pshemo - 你想教一位学术老师真好?
  • @ceph3us 它不仅漂亮,而且可爱。
  • @Pshemo - 很高兴知道还有人愿意教 :)
  • 大部分时间我是来这里学习的,但是当我看到改进的可能性时,我喜欢指出它。希望你不介意:)
猜你喜欢
  • 2013-01-06
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多