java怎么去除JSON数组的重复值

java怎么去除JSON数组的重复值,第1张

对最佳回答进行修改,假设原始Json数组是这样的

原始JSONArry:[{"Value":"15153129877","Key":"09770985-9869-11e7-9c0d-fa163ef28f43"},{"Value":"15153129877","Key":"09770985-9869-11e7-9c0d-fa163ef28f43"}]

工具类如下:

/**

 * 根据Key去重复

 * @param array

 */

public static JSONArray delRepeatIndexid(JSONArray array) {

    JSONArray arrayTemp = new JSONArray()

    int num = 0

    for(int i = 0i < array.size()i++){

        if(num==0){

            arrayTemp.add(array.get(i))

        }else{

            int numJ = 0

            for(int j = 0j < arrayTemp.size() j++){

                JSONObject newJsonObjectI = (JSONObject)array.get(i)

                JSONObject newJsonObjectJ = (JSONObject)arrayTemp.get(j)

                String index_idI = newJsonObjectI.get("Key").toString()

                String valueI = newJsonObjectI.get("Value").toString()

                String index_idJ = newJsonObjectJ.get("Key").toString()

                if(index_idI.equals(index_idJ)){

                    arrayTemp.remove(j)

                    JSONObject newObject = new JSONObject()

                    newObject.put("Key", index_idI)

                    newObject.put("Value", valueI)

                    arrayTemp.add(newObject)

                    break

                }

                numJ++

            }

            if(numJ-1 == arrayTemp.size()-1){

                arrayTemp.add(array.get(i))

            }

        }

        num++

    }

    return arrayTemp

}

处理结果

数据处理后JSONArry:[{"Value":"15153129877","Key":"09770985-9869-11e7-9c0d-fa163ef28f43"}]

完毕!!!!

需求:如果nodeArray中包含了deptType和roleId完全相同的对象,则判断为重复

方法:

但是上述方法所用的循环太多,一旦数组过大,算法复杂度太高,效率低。由于只要判断出当前数组中是否有重复对象,将每一个对象中的value取出,拼成的字符串肯定是唯一的,将获取的字符串存到一个新的对象中,如果新对象中包含此字符串,则重复;否则,继续循环原数组去取下一个对象拼成的字符串...

let nodeArray = [

{deptType: 1, roleId: 10},

{deptType: 1, roleId: 1000},

{deptType: 1, roleId: 100},

{deptType: 2, roleId: 1000},

{deptType: 2, roleId: 1000}

]

function verfiyNode(data) {

let map = {}

for(var i = 0i <data.lengthi++) {

let key = data[i].deptType + '-' + data[i].roleId

let value = map[key]

if (value) {

return false

}

map[key] = key

}

return true

}

要判断json数据的字段与其他数据是否相同,那么肯定是要先解析json数据。解析json数据的方式很多,Gson、FastJson都是很简便实用的工具。这里以Gson为例。

import java.lang.reflect.Type

import java.util.*

import com.google.gson.Gson

import com.google.gson.reflect.TypeToken

public class Divination {

    public static void main(String[] args) {

        String jsonStr = "[{\"depid\":\"5\",\"score\":\"10\"},{\"depid\":\"4\",\"score\":\"40\"},{\"depid\":\"4\",\"score\":\"30\"},{\"depid\":\"5\",\"score\":\"30\"}]"

        System.out.println("原始的json字符串:" + jsonStr)

        // 解析

        Gson gson = new Gson()

        Type type = new TypeToken<ArrayList<JsonData>>() {

        }.getType()

        ArrayList<JsonData> list = gson.fromJson(jsonStr, type)

        // 合并

        List<JsonData> ordered = new ArrayList<>()

        Map<Integer, JsonData> map = new HashMap<>()

        for (JsonData jsonData : list) {

            JsonData data = map.get(jsonData.getDepid())

            if (data != null) { // depid相同的合并score字段

                data.setScore(data.getScore() + jsonData.getScore())

            } else {

                map.put(jsonData.getDepid(), jsonData)

                ordered.add(jsonData)

            }

        }

        // 还原为json字符串

        System.out.println("合并后json字符串:" + gson.toJson(map.values()))

        System.out.println("合并后json字符串(按原来的顺序):" + gson.toJson(ordered))

    }

}

class JsonData {

    private int depid

    private int score

    public int getDepid() {

        return depid

    }

    public void setDepid(int depid) {

        this.depid = depid

    }

    public int getScore() {

        return score

    }

    public void setScore(int score) {

        this.score = score

    }

}

以上代码中List<JsonData>ordered = new ArrayList<>()是为了按原json数组的顺序输出合并后的结果,如果对顺序无要求可以删除相关代码。

运行结果:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9416983.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存