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

时间:2019-03-08 14:35:56

标签: java json

更新
使用您的建议检查字符串之间的关系,我发现区别在于某些字段的排列方式,因为这些字符串实际上是JSON字符串。

示例:
字符串1上的字段username: johndoe@dummy.com位于开头,但位于字符串2中间的某个位置。 我想知道是否有一种方法可以检查或比较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 个答案:

答案 0 :(得分:3)

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

换句话说:内置Java字符串比较方法很可能是正确的,导致:您输入的字符串不相等。相等的字符串极不可能导致let image = self.attachment_one_img.image let imageData = image?.jpegData(compressionQuality: 1) let base64String = (imageData)?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) let trimmedString_one = base64String?.trimmingCharacters(in: .whitespaces) Print(trimmedString_one) // I am getting huge data string length 给出假。

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

  • 迭代第一个字符串,一个字符一个字符
  • 从第二个字符串中获取相应的字符
  • 比较那些(“完全”等于或忽略大小写)
  • 不匹配:打印出索引和两个不同的字符(您确保在其中打印类似equals()之类的字符,以确保不能打印的字符,或者使用Character.getNumericValue())

因此,这里的答案基本上是让您自己进行适当的调试。

答案 1 :(得分:3)

  

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

如果这些是JSON数据,请不要将它们与String进行比较。
使用JSON库(Jackson,GSON或其他任何一种)表示这些数据并进行比较({equals()通常被覆盖)。它将通过考虑或忽略空格,节点顺序之类的内容,更清晰,更具体地比较它们。等等... 您可以找到一些示例here

您可以更特别地考虑SkyScreamer库,该库提供了多种样式来比较JSON。例如this JSONAssert.assertEquals() overload

public static void assertEquals(org.json.JSONArray expected,
                                org.json.JSONArray actual,
                                JSONCompareMode compareMode)
                         throws org.json.JSONException

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

答案 2 :(得分:2)

170k对于字符串来说不是太大,尽管对于源代码中的字符串文字而言,它很大。

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

您提到字符串不是文本而是JSON。对于大多数目的,您想标准化json(使空格,属性顺序和标点符号相同)。