为了账号安全,请及时绑定邮箱和手机立即绑定

Java很长的字符串比较似乎不起作用

Java很长的字符串比较似乎不起作用

紫衣仙女 2022-07-27 11:14:53
更新:使用您在检查字符串之间的建议,我发现不同之处在于某些字段的排列,因为这些字符串实际上是 JSON 字符串。示例: string1 上的字段username: johndoe@dummy.com位于开头,但位于 string2 的中间某处。我想知道是否有一种方法可以检查或比较 2 个 json 对象,而不管它们的字段/属性的排列如何……只要它们的内容(字段值)相同。我尝试了什么:private boolean sameJsonObject(Object o1, Object o2) throws IOException {    if (o1 == null || o2 == null) {        return false;    }    JsonNode json1 = mapper.readTree(mapper.writeValueAsString(o1));    JsonNode json2 = mapper.readTree(mapper.writeValueAsString(o2));    return json1.equals(json2);}这行得通,但我相信这可以改进。原始问题:我想检查两个字符串是否相等,但是这些字符串真的很长,不能设置为变量/字符串对象,并且字符串常量太长。我知道有equals(), equalsIgnoreCase(),StringUtils.equals(s1, s2)但这些似乎都不起作用。我正在比较的字符串来自两个不同的来源,并且手动比较它会得到相同的结果(我的意思是内容相同)。我试图在这里发布示例字符串,但我不能。要比较的每个字符串的大小超过 30k(每个字符串 170k)。顺便说一句,这些字符串是实际数据(json),它们真的很大,我想测试它的相等性(内容)。有没有办法在java中进行检查?
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

简单的答案是:逐个字符比较两个字符串。

换句话说:很可能,内置的 Java 字符串比较方法是正确的,导致:您的输入字符串不相等。相等的字符串极不可能导致equals()给出错误。

因此,合理的第一个选择是:更改您的比较代码,使其:

  • 逐个字符地迭代第一个字符串

  • 从第二个字符串中获取对应的字符

  • 比较那些(“完整”等于或忽略大小写)

  • 关于不匹配:打印出索引和两个不同的字符(您确保打印一些东西,例如"<" + thatChar + ">"只是为了确保不可打印的字符,或者可能使用 Character.getNumericValue())

所以,这里的答案基本上是让自己能够进行适当的调试。


查看完整回答
反对 回复 2022-07-27
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

顺便说一句,这些字符串是实际数据(json),它们真的很大,我想测试它的相等性(内容)。


如果这些是 JSON 数据,请不要将它们与 String 进行比较。

使用 JSON 库(Jackson、GSON 或任何东西)来表示这些数据并比较它们(equals()通常被覆盖)。它会通过考虑或忽略空格、节点顺序等内容来更清晰、更具体地比较它们。 . 你可以在这里找到一些例子。


您可以更特别地考虑 SkyScreamer 库,它提供多种风格来比较 JSON。例如这个JSONAssert.assertEquals()重载:


public static void assertEquals(org.json.JSONArray expected,

                                org.json.JSONArray actual,

                                JSONCompareMode compareMode)

                         throws org.json.JSONException

您可以在其中指定一个JSONCompareMode对象,例如 JSONCompareMode.LENIENT.


查看完整回答
反对 回复 2022-07-27
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

170k 对于字符串来说并不算大,尽管对于源代码中的字符串文字来说它很大。

从包含它们的文件中加载您的两个字符串,并使用 equals 以正常方式进行比较。

您提到字符串不是文本而是 JSON。在大多数情况下,您需要规范化您的 json(使空格、属性顺序和标点符号相同)。


查看完整回答
反对 回复 2022-07-27
  • 3 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信