比较map对象之间的工具类,特殊场景,value的string类型相等,认同为相等(附源码)

导读:本篇文章讲解 比较map对象之间的工具类,特殊场景,value的string类型相等,认同为相等(附源码),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

比较map对象之间的工具类,特殊场景,value的string类型相等,认同为相等(附源码)

问题背景

这次的项目中有个需求,过滤结果集中的相同的数据,但这个数据集里面的对象是JSONObject或者map,它们中的value值可能是字符串类型,或者number类型。我们则认为相等,则需要过滤

例如,这两个我认为是相等的,虽然value的类型不同

HashMap<String, Object> map1 = new HashMap<>();
HashMap<String, Object> map2 = new HashMap<>();
map1.put("a", 1);
map2.put("a", "1");

注意事项:

工具类编写

1 引入一个先验知识,HashMap和JSONObject的equals是重写过的,所以使用equals是进行内容比较,例如

HashMap<String, Object> map1 = new HashMap<>();
HashMap<String, Object> map2 = new HashMap<>();
map1.put("a", "1");
map2.put("a", "1");
System.out.println(map1 == map2); 		 //结果为false
System.out.println(map1.equals(map2));   //结果为true

map1和map2是两个不用的对象,但内容是相等的,所有equals是true,JSONObject也是这样的

2 新建工程,引入pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yg</groupId>
    <artifactId>mapUtils</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mapUtils</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

3 新建工具类

package com.yg.maputils.utils;

import com.alibaba.fastjson.JSONObject;

import java.util.*;

/**
 * @Author suolong
 * @Date 2022/5/18 17:04
 * @Version 2.0
 */
public class MapUtils {

    public static boolean mapCompare(Map<String, Object> map1, Map<String, Object> map2) {
        if (map1.size() != map2.size()) {
            return false;
        }
        List<String> keyList1 = new ArrayList<>(map1.keySet());
        List<String> keyList2 = new ArrayList<>(map2.keySet());
        for (String key : keyList1) {
            if (keyList2.contains(key)) {
                String value1 = String.valueOf(map1.get(key));
                String value2 = String.valueOf(map2.get(key));
                if (!value1.equals(value2)) {
                    return false;
                }
            } else {
                return false;
            }
        }
        return true;
    }


    public static List<HashMap<String, Object>> deduplicateMap(List<HashMap<String, Object>> mapList) {
        Set<HashMap<String, Object>> duplicateSet = new HashSet<>(mapList);
        mapList = new ArrayList<>(duplicateSet);
        List<HashMap<String, Object>> duplicateList = new ArrayList<>();
        int size = mapList.size();
        for (int i = 0; i < size; i++) {
            HashMap<String, Object> map1 = mapList.get(i);
            for (int j = i + 1; j < size; j++) {
                HashMap<String, Object> map2 = mapList.get(j);
                if (mapCompare(map1, map2)) {
                    duplicateList.add(map2);
                }
            }
        }
        for (HashMap<String, Object> duplicate : duplicateList) {
            mapList.remove(duplicate);
        }
        return mapList;
    }


    public static List<JSONObject> deduplicateJSONObject(List<JSONObject> jsonObjectList) {
        Set<JSONObject> duplicateSet = new HashSet<>(jsonObjectList);
        jsonObjectList = new ArrayList<>(duplicateSet);
        List<JSONObject> duplicateList = new ArrayList<>();
        int size = jsonObjectList.size();
        for (int i = 0; i < size; i++) {
            JSONObject jsonObject1 = jsonObjectList.get(i);
            for (int j = i + 1; j < size; j++) {
                JSONObject jsonObject2 = jsonObjectList.get(j);
                if (mapCompare(jsonObject1, jsonObject2)) {
                    duplicateList.add(jsonObject2);
                }
            }
        }
        for (JSONObject duplicate : duplicateList) {
            jsonObjectList.remove(duplicate);
        }
        return jsonObjectList;
    }

}

4 主函数测试

package com.yg.maputils.service;

import com.alibaba.fastjson.JSONObject;
import com.yg.maputils.utils.MapUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @Author suolong
 * @Date 2022/5/19 15:21
 * @Version 2.0
 */
public class Main {

    public static void main(String[] args) {
        HashMap<String, Object> map1 = new HashMap<>();
        HashMap<String, Object> map2 = new HashMap<>();
        HashMap<String, Object> map3 = new HashMap<>();
        HashMap<String, Object> map4 = new HashMap<>();
        HashMap<String, Object> map5 = new HashMap<>();
        map1.put("a", 1);
        map2.put("a", "1");
        map3.put("a", "1");
        map4.put("a", "1");
        map5.put("a", "1");
        System.out.println(map1.equals(map2));
        System.out.println(MapUtils.mapCompare(map1, map2));
        List<HashMap<String, Object>> list = new ArrayList<>();
        list.add(map1);
        list.add(map2);
        list.add(map3);
        list.add(map4);
        list.add(map5);
        System.out.println(list);
        System.out.println(MapUtils.deduplicateMap(list));
        System.out.println();
        System.out.println();
        JSONObject json1 = new JSONObject();
        JSONObject json2 = new JSONObject();
        JSONObject json3 = new JSONObject();
        JSONObject json4 = new JSONObject();
        JSONObject json5 = new JSONObject();
        json1.put("a", 1);
        json2.put("a", "1");
        json3.put("a", "1");
        json4.put("a", "1");
        json5.put("a", "1");
        System.out.println(json1.equals(json2));
        System.out.println(MapUtils.mapCompare(json1, json2));
        List<JSONObject> list1 = new ArrayList<>();
        list1.add(json1);
        list1.add(json2);
        list1.add(json3);
        list1.add(json4);
        list1.add(json5);
        System.out.println(list1);
        System.out.println(MapUtils.deduplicateJSONObject(list1));
    }

}

5 测试结果,过滤之后,只剩下一个map了
比较map对象之间的工具类,特殊场景,value的string类型相等,认同为相等(附源码)

总结

  • 可能遇到的场景不多,需要的同学直接获取参考就行

作为程序员第 138 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
比较map对象之间的工具类,特殊场景,value的string类型相等,认同为相等(附源码)比较map对象之间的工具类,特殊场景,value的string类型相等,认同为相等(附源码)比较map对象之间的工具类,特殊场景,value的string类型相等,认同为相等(附源码)

Lyric: 在我忘记之前

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110737.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!