首页 > 解决方案 > Java很长的字符串比较似乎不起作用

问题描述

更新:
使用您在检查字符串之间的建议,我发现不同之处在于某些字段的排列,因为这些字符串实际上是 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中进行检查?

谢谢!

标签: javajson

解决方案


顺便说一句,这些字符串是实际数据(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.


推荐阅读