更新:
使用您的建议检查字符串之间的关系,我发现区别在于某些字段的排列方式,因为这些字符串实际上是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中进行检查?
谢谢!
答案 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(使空格,属性顺序和标点符号相同)。