两个字符串数组对象需要进行比较是否相等,怎么把两个字符串对象保持顺序一致进行比较?

两个字符串数组对象需要进行比较是否相等,怎么把两个字符串对象保持顺序一致进行比较?

A字符串对象:

[
    {
        "Field":"id",
        "Type":"int(11)",
        "Null":"NO",
        "Extra":"auto_increment",
        "Key":"PRI"
    },
    {
        "Field":"app_id",
        "Type":"varchar(8)",
        "Null":"YES",
        "Extra":"",
        "Key":""
    }
]

B字符串对象:

[
    {
        "Field":"id",
        "Type":"int(11)",
        "Null":"NO",
        "Key":"PRI",
        "Extra":"auto_increment"
    },
    {
        "Field":"app_id",
        "Type":"varchar(8)",
        "Null":"YES",
        "Key":"",
        "Extra":""
    }
]

A字符串对象和B字符串对象的Key和Extra键值顺序不一样,不能直接比较,怎么实现B的顺序和A的一样呢?

img

img

如果是希望最终比较字符串,可以先处理一下原字符串:重新按照一定规则排列对象的key,比如题主前面说的:

要实现的效果就是将A和B的所有键都按字母顺序排序一遍,怎么实现?

核心原理就是用TreeMap保证对象的key按照字典升序排列

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class Main {

    public static void main(String[] args) {
        String A = "[\n" +
                "    {\n" +
                "        \"Field\":\"id\",\n" +
                "        \"Type\":\"int(11)\",\n" +
                "        \"Null\":\"NO\",\n" +
                "        \"Extra\":\"auto_increment\",\n" +
                "        \"Key\":\"PRI\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"Field\":\"app_id\",\n" +
                "        \"Type\":\"varchar(8)\",\n" +
                "        \"Null\":\"YES\",\n" +
                "        \"Extra\":\"\",\n" +
                "        \"Key\":\"\"\n" +
                "    }\n" +
                "]";
        String B = "[\n" +
                "    {\n" +
                "        \"Field\":\"id\",\n" +
                "        \"Type\":\"int(11)\",\n" +
                "        \"Null\":\"NO\",\n" +
                "        \"Key\":\"PRI\",\n" +
                "        \"Extra\":\"auto_increment\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"Field\":\"app_id\",\n" +
                "        \"Type\":\"varchar(8)\",\n" +
                "        \"Null\":\"YES\",\n" +
                "        \"Key\":\"\",\n" +
                "        \"Extra\":\"\"\n" +
                "    }\n" +
                "]";

        String sortedKeyA = sortedKeyArray(JSON.parseArray(A));
        String sortedKeyB = sortedKeyArray(JSON.parseArray(B));

        System.out.println(sortedKeyA);
        System.out.println("---------------------------");
        System.out.println(sortedKeyB);

    }

    private static String sortedKeyArray(JSONArray array) {
        List<Map<String, Object>> list = new ArrayList<>();
        for (Object o : array) {
            JSONObject json = JSON.parseObject(JSON.toJSONString(o));
            Map<String, Object> sortedKeyMap = new TreeMap<>(json);
            list.add(sortedKeyMap);
        }
        return JSON.toJSONString(list, JSONWriter.Feature.PrettyFormat);
    }

}

输出结果:

img

如果按字符串比较,那确实是不一样的,比如key的顺序,格式化后空格的多少等都会导致不一样。
如果不考虑这些,只考虑数据,那么可以使用jackson、gson、fastjson等工具将内容读取成对象或者map,比较对象或者map即可。
如果有用,望采纳,谢谢!

不能直接对两个字符串对象所有键值代表的字符串直接比较吗,这样就按键来,不用考虑顺序了

谢邀。

直接把 json 序列化解析成 a,b 两个对象,通过重写 equals 方法,来比较 a,b 两个对象的键(key)对应的值是不是一样的就行了呀。别忘了重新 hashcode 方法哦。

如果全部值都是一样的,就可以认为是一样的了。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^