排序器实现

实现一个排序器,支持多重排序,直接上代码吧!


import com.google.gson.reflect.TypeToken;
import monkey.common.ObjectMapper;
import monkey.common.Result;
import seagull.data.view.ApiResultData;

import java.util.*;

/**
 * @author tmuffamd
 * @date 2022/8/8 - 14:27
 */
public class ListComparatorUtils {


    public static <E> void sort(List<Map<String, Object>> list, final LinkedHashMap<String, String> sortFields) {
        Collections.sort(list, new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> a, Map<String, Object> b) {
                int ret = 0;
                try {
                    for (Map.Entry<String, String> entry : sortFields.entrySet( )) {
                        Object value1 = a.get(entry.getKey( ));
                        Object value2 = b.get(entry.getKey( ));
                        if (value1 instanceof Number && value2 instanceof Number) {
                            if (entry.getValue( ).equals("asc")) {
                                ret = Double.valueOf(value1.toString()).compareTo(Double.valueOf(value2.toString()));
                            } else {
                                ret = Double.valueOf(value2.toString()).compareTo(Double.valueOf(value1.toString()));
                            }
                        }else{
                            if (entry.getValue( ).equals("asc")) {
                                ret = value1.toString().compareTo(value2.toString());
                            } else {
                                ret = value2.toString().compareTo(value1.toString());
                            }
                        }
                        if (0 != ret) {break;}
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return ret;
            }
        });
    }
    public static Comparator<Map<String, Object>> buildComparator(LinkedHashMap<String, String> sortFields) {
        Comparator<Map<String, Object>> comparator = null;
        for (Map.Entry<String, String> entry : sortFields.entrySet()) {
            String sort = entry.getValue( );
            String field = entry.getKey( );
            if (comparator == null) {
                if ("desc".equals(sort)) {
                    comparator = Comparator.comparing((Map<String, Object> map) ->  map.get(field).toString(),Comparator.reverseOrder());
                }else{
                    comparator = Comparator.comparing((Map<String, Object> map) ->  map.get(field).toString());
                }
            } else {
                if ("desc".equals(sort)) {
                    comparator = comparator.thenComparing((Map<String, Object> map) -> Double.valueOf(map.get(entry.getKey()).toString()),Comparator.reverseOrder());
                }else{
                    comparator = comparator.thenComparing((Map<String, Object> map) -> Double.valueOf(map.get(entry.getKey()).toString()));
                }
            }
        }
        return comparator;
    }
    public static void main(String[] args) {
        String resultJSON = "{\"statusCode\":600,\"data\":{\"total\":0,\"pageNum\":1,\"pageSize\":10,\"list\":[{\"rank\":1,\"proportion\":0.5307,\"cashier_id\":\"100\",\"charge_num\":72,\"charge_money\":43964.67},{\"rank\":3,\"proportion\":0.062,\"cashier_id\":\"989192982705999872\",\"charge_num\":95,\"charge_money\":13696.0},{\"rank\":3,\"proportion\":0.1566,\"cashier_id\":\"989192982705999872\",\"node_code\":\"0001\",\"charge_num\":5,\"charge_money\":12973.0},{\"rank\":3,\"proportion\":0.062,\"cashier_id\":\"989192982705999872\",\"charge_num\":4,\"charge_money\":5140.55},{\"rank\":5,\"proportion\":0.0546,\"cashier_id\":\"989200563587518464\",\"charge_num\":48,\"charge_money\":4527.0},{\"rank\":6,\"proportion\":0.0149,\"cashier_id\":\"988826457948034048\",\"charge_num\":5,\"charge_money\":1237.13},{\"rank\":7,\"proportion\":0.0118,\"cashier_id\":\"989192982705999872\",\"node_code\":\"0003\",\"charge_num\":1,\"charge_money\":981.0},{\"rank\":8,\"proportion\":0.0018,\"cashier_id\":\"1004393987248771072\",\"charge_num\":4,\"charge_money\":151.51999999999998},{\"rank\":9,\"proportion\":0.0016,\"cashier_id\":\"988805509475734528\",\"charge_num\":2,\"charge_money\":134.9},{\"rank\":10,\"proportion\":3.0,\"cashier_id\":\"949254323525686272\",\"charge_num\":1,\"charge_money\":26.0},{\"rank\":11,\"proportion\":0.0,\"cashier_id\":\"10070\",\"charge_num\":0,\"charge_money\":0.0},{\"rank\":12,\"proportion\":0.0,\"cashier_id\":\"0\",\"charge_num\":0,\"charge_money\":0.0}]}}";
        Result<ApiResultData> result = ObjectMapper.fromJson(resultJSON, new TypeToken<Result<ApiResultData>>(){}.getType());
        List<Map<String, Object>> list = result.getData().getList();
        list.forEach(item-> System.out.println(item ));
        System.out.println("===============" );
        LinkedHashMap<String, String> sortFields = new LinkedHashMap<>();
        sortFields.put("rank","desc");
        sortFields.put("proportion","desc");
        sortFields.put("cashier_id","asc");
        sortFields.put("charge_num","asc");
        //sort(list,sortFields);
        list.sort(buildComparator(sortFields));
        list.forEach(item-> System.out.println(item ));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
//插入排序 List insertSort(List list){ for(int i = 2;i <= list.getLength(); i ++){ list.getList()[0] = list.getList()[i];//复制为哨兵 int j; for(j = i-1;other.lower(list.getList()[0],list.getList()[j]);j -- ){ list.getList()[j + 1] = list.getList()[j]; }//记录后移 list.getList()[j + 1] = list.getList()[0];//插入到正确位置 } return list; } //折半插入排序 List BInsertSort(List list){ for(int i = 2; i <= list.getLength(); i ++){ list.getList()[0] = list.getList()[i];//暂存,不是哨兵作用了 int low = 1,high = i -1; while(low <= high){//折半查找要插入的位置 int m = (low + high) / 2; if(other.lower(list.getList()[0],list.getList()[m])) high = m - 1; else low = m + 1; } for(int j = i -1; j >= high + 1; j --){ list.getList()[j +1] = list.getList()[j];//记录后移 } list.getList()[high + 1] = list.getList()[0]; } return list; } //希尔排序 List shellSort(List list,int t){ int[] temp = new int[t];//增量数组 for(int i = t - 1,j = 1; i >= 0 ; i --,j += 2){ temp [i] = j; }//构造增量数组,确保最后一个元素值为1 for(int k = 0; k < t; k ++){ shellInsert(list,temp[k]);//增量为temp[k] } return list; } //一趟的希尔排序 void shellInsert(List list,int k){ //对顺序表作一趟希尔插入排序 for(int i = k + 1; i <= list.getLength(); i ++){ list.getList()[0] = list.getList()[i];//暂存,不作哨兵 int j; for(j = i - k; j > 0 && other.lower(list.getList()[0],list.getList()[j]); j -= k){ list.getList()[j + k] = list.getList()[j];//记录后移 } list.getList()[j + k] = list.getList()[0]; } //return list; } //冒泡排序 List bubbleSort(List list){ boolean change = true;//一个交换标志,当为false时,表示已排序好 int temp; for(int i = list.getLength();i >= 2 && change; i --){ change = false; for(int j = 1; j < i; j ++ ){ if(other.lower(list.getList()[j + 1], list.getList()[j])){//两个元素逆序,交换 temp = list.getList()[j + 1]; list.getList()[j + 1] = list.getList()[j]; list.getList()[j] = temp; change = true; } } } return list; } //快速排序 List quickSort(List list){ return QSort(list,1,list.getLength()); } //交换list子表的记录,使枢轴记录到位,并返回此位,在此位之前的记录均小于它,之后的记录均大于它 int partition(List list,int low,int high){ list.getList()[0] = list.getList()[low];//用子表第一个元素作枢轴,0元素为暂存枢轴 int pivotKey = list.getList()[low]; while(low < high){ while(low < high && list.getList()[high] >= pivotKey) -- high; list.getList()[low] = list.getList()[high]; while(low < high && list.getList()[low] <= pivotKey) ++ low; list.getList()[high] = list.getList()[low]; } list.getList()[low] = list.getList()[0]; return low; } //递归形式 List QSort(List list,int low,int high){ int pivotKey; if(low < high){ pivotKey = partition(list,low,high); QSort(list,low,pivotKey - 1);//递归 QSort(list,pivotKey + 1, high); } return list; } //简单选择排序 List selectSort(List list){ int j; int temp; for(int i = 1;i < list.getLength(); i ++){// j = selectMinKey(list,i);//初始化后再使用 if( i != j){ temp = list.getList()[j]; list.getList()[j] = list.getList()[i]; list.getList()[i] = temp; } } return list; } //选择最小的 int selectMinKey(List list, int k){ int min = k;// for(int i = k ; i <= list.getLength();i ++){ if(other.lower(list.getList()[i],list.getList()[min])) min = i; } return min; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值