如何对List<Map<String, Object>>进行排序

本文介绍了如何对List<Map<String, Object>>按指定字段进行排序,包括int和double类型,并演示了如何对List<List<String>>进行定制排序。此外,还提供了对象集合转Map以及Map value值排序的方法。

在我们的统计中经常会有List<Map<String, Object>>格式的数据,但是我们需要对这种数据进行排序,我们可以使用Comparator撰写工具类对其排序

1.对List<Map<String, Object>>进行排序

对于需要对Map集合某一键值进行排序,可以自己撰写如下代码,对我们的List<Map<String, Object>>进行排序,得到排序好的List<Map<String, Object>>,只需要传入需要排序的list以及需要排序的字段,即可完成排序

/**
 * @author wangli
 * @create 2022-08-18 17:51
 */
public class  SortUtil {
    /**
     * 对List<Map<String, Object>>中int类型的字段排序
     * @param data 包含key为sort,value为desc,asc的map
     * @param yList 需要排序的list
     * @param type 需要排序的字段
     * @return 返回排序后的List<Map<String, Object>>
     */
    public static List<Map<String, Object>> sortMap(Map<String, Object> data, List<Map<String, Object>> yList, String type) {
        if (Objects.equals(data.get("sort"), "asc")) {
            yList.sort(Comparator.comparingInt(o -> Integer.parseInt(o.get(type).toString())));
            return yList;
        } else {
            Collections.sort(yList, (o1, o2) -> Integer.parseInt(o2.get(type).toString()) - Integer.parseInt(o1.get(type).toString()));
        }
        return yList;
    }
    /**
     * 对List<Map<String, Object>>中double类型的字段排序
     * @param data 包含key为sort,value为desc,asc的map
     * @param yList 需要排序的list
     * @param type 需要排序的字段
     * @return 返回排序后的List<Map<String, Object>>
     */
    public static List<Map<String, Object>> sortDoubleMap(Map<String, Object> data, List<Map<String, Object>> yList, String type) {
        if (Objects.equals(data.get("sort"), "asc")) {
            yList.sort(Comparator.comparingDouble(o -> Double.parseDouble(o.get(type).toString())));
            return yList;
        } else {
            Collections.sort(yList, (o1, o2) -> {
                Double a = Double.parseDouble(o2.get(type).toString());
                Double b = Double.parseDouble(o1.get(type).toString());
                if (a > b) {
                    return 1;
                }
                return -1;
            });
        }
        return yList;
    }

}
创建测试方法,生成一些数据,对我们撰写的方法进行测试,测试demo如下
public class TestProject {
    @Test
    public void test1(){
        ArrayList<Map<String, Object>> maps = new ArrayList<>();
        for (int i = 0; i <3; i++) {
            HashMap<String, Object> map = new HashMap<>();
            map.put("count",i*2+1);
            maps.add(map);
        }
        HashMap<String, Object> data = new HashMap<>();
        data.put("sort","desc");
        maps.stream().forEach(System.out::println);
        List<Map<String, Object>> list = SortUtil.sortMap(data, maps, "count");
        maps.stream().forEach(System.out::println);
    }

}

 排序结果打印如下

2.对List<List<String>>进行排序

    /**
     * @param data 输入需要排序的参数
     * @param yList 需要排序的List<List<String>>
     * @param s 需要过滤不排序的信息
     * @param i list中需要排序的第几个字段
     * @return 排序后的List<List<String>>
     */
    public static List<List<String>> sortContainList(Map<String, Object> data, List<List<String>> yList,String s,int i) {
        if (Objects.equals(data.get("sort"), "asc")) {
            yList.sort(Comparator.comparingInt(o -> Integer.parseInt(o.get(i))));
            return yList;
        } else {
            Collections.sort(yList, (o1, o2) -> {
                if (o1.get(i).equals(s)||o2.get(i).equals(s)){
                    return 1;
                }else {
                    return Integer.parseInt(o2.get(i)) - Integer.parseInt(o1.get(i));
                }
            });
        }
        return yList;
    }

3.传入对象集合转换为List<Map<String,Object>>

我们在工作中有很多时候需要将List<User>转换为List<Map<String,Object>>这种格式的需求,所以我们可以调用如下方法,针对业务进行修改,完成转化过程。

    /**
     * 传入list对象转换为List<Map<String,Object>>
     * @param list 传入对象集合
     * @return 返回map集合
     */
    public static  List<Map<String,Object>> entityConvertMap(List<?> list){
        List<Map<String,Object>> l = new LinkedList<>();
        try {
            for(Object t : list){
                Map<String,Object> map = new HashMap<>();
                Method[] methods = t.getClass().getMethods();
                for (Method method : methods) {
                    if (method.getName().startsWith("get")) {
                        String name = method.getName().substring(3);
                        name = name.substring(0, 1).toLowerCase() + name.substring(1);
                        Object value = method.invoke(t);
                        if (value!=null&&!name.equals("version")&&!name.equals("class")){
                            map.put(name,value);
                        }
                    }
                }
                l.add(map);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return l;
    }

4.Map的value值排序

在工作中有很多地方需要对Map的value值进行排,我们只需要导入这个方法传入需要排序的Map获取排序好的Map即可

    // Map的value值降序排序
    public static <K, V extends Comparable<? super V>> Map<K, V> sortDescend(Map<K, V> map) {
        List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
            @Override
            public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
                int compare = (o1.getValue()).compareTo(o2.getValue());
                return -compare;
            }
        });

        Map<K, V> returnMap = new LinkedHashMap<K, V>();
        for (Map.Entry<K, V> entry : list) {
            returnMap.put(entry.getKey(), entry.getValue());
        }
        return returnMap;
    }

    // Map的value值升序排序
    public static <K, V extends Comparable<? super V>> Map<K, V> sortAscend(Map<K, V> map) {
        List<Map.Entry<K, V>> list = new ArrayList<Map.Entry<K, V>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
            @Override
            public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
                int compare = (o1.getValue()).compareTo(o2.getValue());
                return compare;
            }
        });

        Map<K, V> returnMap = new LinkedHashMap<K, V>();
        for (Map.Entry<K, V> entry : list) {
            returnMap.put(entry.getKey(), entry.getValue());
        }
        return returnMap;
    }

Java 中,对 `List<Map<String,Object>>` 进行分组可以使用 Java 8 的 Lambda 新特性结合 `Collectors.groupingBy` 方法实现。该方法可以根据 `Map` 中的某个属性进行分组,返回结果是 `Map<String,List<Map<String,Object>>>`。 以下是示例代码: ```java import java.util.*; import java.util.stream.Collectors; public class GroupingExample { public static void main(String[] args) { List<Map<String,Object>> list = new ArrayList<>(); Map<String,Object> map1 = new HashMap<>(); map1.put("分组","A"); map1.put("map","map1"); list.add(map1); Map<String,Object> map2 = new HashMap<>(); map2.put("分组","B"); map2.put("map","map2"); list.add(map2); Map<String,Object> map3 = new HashMap<>(); map3.put("分组","A"); map3.put("map","map3"); list.add(map3); Map<String,Object> map4 = new HashMap<>(); map4.put("分组","B"); map4.put("map","map4"); list.add(map4); // 使用 Collectors.groupingBy 方法根据 "分组" 属性进行分组 Map<String,List<Map<String,Object>>> mapList = list.stream() .collect(Collectors.groupingBy((Map m) -> (String) m.get("分组"))); // 输出分组结果 System.out.println(mapList); } } ``` 在上述代码中,首先创建了一个 `List<Map<String,Object>>` 类型的列表,并向其中添加了几个 `Map` 元素。然后使用 `stream()` 方法将列表转换为流,接着使用 `Collectors.groupingBy` 方法根据 `Map` 中的 `"分组"` 属性进行分组,最后将分组结果存储在 `Map<String,List<Map<String,Object>>>` 类型的 `mapList` 中并输出。 另一个示例代码如下,通过自定义方法来生成分组的键: ```java import java.util.*; import java.util.stream.Collectors; public class AnotherGroupingExample { public void aaa(){ List<Map<String,Object>> list = new ArrayList<>(); Map<String,Object> map = new HashMap<>(); map.put("dicId","aaa"); map.put("dicName","钢材"); map.put("dicDes","钢材1号"); list.add(map); map = new HashMap<>(); map.put("dicId","bbb"); map.put("dicName","钢筋"); map.put("dicDes","钢筋1号"); list.add(map); map = new HashMap<>(); map.put("dicId","111"); map.put("dicName","钢筋"); map.put("dicDes","钢筋2号"); list.add(map); map = new HashMap<>(); map.put("dicId","ccc"); map.put("dicName","河沙"); map.put("dicDes","河沙1号"); list.add(map); // 使用自定义方法 customKey 生成分组的键 Map<String, List<Map<String, Object>>> collect = list.stream() .collect(Collectors.groupingBy(this::customKey)); } private String customKey(Map<String,Object> map){ return map.get("dicId").toString(); } } ``` 在这个示例中,定义了一个 `customKey` 方法,用于根据 `Map` 中的 `"dicId"` 属性生成分组的键,然后使用 `Collectors.groupingBy` 方法结合该自定义方法对列表进行分组。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨会停rain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值