zoukankan      html  css  js  c++  java
  • java基础---->多个排序的拓展

      根据一些特定的规则,我们可以利用java的反射机制做到很有趣的封装。

    java的排序封装

    一、定义一些comparator

    AmountComparatorAsc:amount升序

    package com.huhx.example;
    
    import java.util.Comparator;
    import java.util.Map;
    
    @SuppressWarnings("rawtypes")
    public class AmountComparatorAsc implements Comparator<Map> {
    
        @Override
        public int compare(Map map1, Map map2) {
            Integer amount1 = (Integer) map1.get("amount");
            Integer amount2 = (Integer) map2.get("amount");
            return amount2 - amount1;
        }
    }

    AmountComparatorDesc:amount降序

    package com.huhx.example;
    
    import java.util.Comparator;
    import java.util.Map;
    
    @SuppressWarnings("rawtypes")
    public class AmountComparatorDesc implements Comparator<Map> {
    
        @Override
        public int compare(Map map1, Map map2) {
            Integer amount1 = (Integer) map1.get("amount");
            Integer amount2 = (Integer) map2.get("amount");
            return amount1 - amount2;
        }
    }

    RateComparatorAsc: 利率升序

    package com.huhx.example;
    
    import java.util.Comparator;
    import java.util.Map;
    
    @SuppressWarnings("rawtypes")
    public class RateComparatorAsc implements Comparator<Map> {
    
        @Override
        public int compare(Map map1, Map map2) {
            int flag = 0;
            String rateStr1 = (String) map1.get("lilv");
            String rateStr2 = (String) map2.get("lilv");
            float rateSub = Float.valueOf(rateStr1.replace("%", "")) - Float.valueOf(rateStr2.replace("%", ""));
            if (rateSub > 0) {
                flag = 1;
            } else if(rateSub < 0) {
                flag = -1;
            } else {
                flag = 0;
            }
            return flag;
        }
    }

     RateComparatorDesc:利率降序

    package com.huhx.example;
    
    import java.util.Comparator;
    import java.util.Map;
    
    @SuppressWarnings("rawtypes")
    public class RateComparatorDesc implements Comparator<Map> {
        @Override
        public int compare(Map map1, Map map2) {
            int flag = 0;
            String rateStr1 = (String) map1.get("lilv");
            String rateStr2 = (String) map2.get("lilv");
            
            float rateSub = Float.valueOf(rateStr2.replace("%", "")) - Float.valueOf(rateStr1.replace("%", ""));
            if (rateSub > 0) {
                flag = 1;
            } else if (rateSub < 0) {
                flag = -1;
            } else {
                flag = 0;
            }
            return flag;
        }
    }

    二、定义排序的工具类:SequenceUtils的sort方法

    package com.huhx.example;
    
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author huhx
     */
    public class SequenceUtils {
        public final static String COMPARATOR_NAME = "Comparator";
        public final static String ASC_ORDER = "Asc";
        public final static String DESC_ORDER = "Desc";
        public final static String PACKAGE_PATH = "com.huhx.example"
    ;    
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static void sort(String order, String data, List list) {
            
            String classStrName = comparatorName(order, data);
            try {
                Comparator<Map> comparator =  (Comparator<Map>)Class.forName(PACKAGE_PATH + "." +classStrName).newInstance();
                Collections.sort(list, comparator);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        // 0 stands for asc, 1 stands for desc
        public static String comparatorName(String order, String data) {
            String dataName = changeFirstUpper(data);
            String oderName = "";
            if (order.equals("0")) {
                oderName = ASC_ORDER;
            } else if (order.equals("1")) {
                oderName = DESC_ORDER;
            }
            return dataName + COMPARATOR_NAME + oderName;
        }
    
        private static String changeFirstUpper(String data) {
            String str = data.substring(0, 1);
            return str.toUpperCase() + data.substring(1, data.length());
        }
    }

    三、我们的测试类以及测试数据:sequence

    测试的数据:

    private static void initData(List<Map> data) {
        Map map = new HashMap();
        map.put("lilv", "10%");
        map.put("amount", 2000);
        data.add(map);
    
        map = new HashMap();
        map.put("lilv", "60%");
        map.put("amount", 7000);
        data.add(map);
    
        map = new HashMap();
        map.put("lilv", "80%");
        map.put("amount", 5000);
        data.add(map);
    
        map = new HashMap();
        map.put("lilv", "20%");
        map.put("amount", 3000);
        data.add(map);
        
        map = new HashMap();
        map.put("lilv", "50%");
        map.put("amount", 6000);
        data.add(map);
        
        map = new HashMap();
        map.put("lilv", "90%");
        map.put("amount", 1000);
        data.add(map);
        
        map = new HashMap();
        map.put("lilv", "30%");
        map.put("amount", 8000);
        data.add(map);
        
        map = new HashMap();
        map.put("lilv", "70%");
        map.put("amount", 4000);
        data.add(map);
        
        map = new HashMap();
        map.put("lilv", "40%");
        map.put("amount", 10000);
        data.add(map);
        
        map = new HashMap();
        map.put("lilv", "100%");
        map.put("amount", 9000);
        data.add(map);
    }
    View Code

    main类的代码如下:

    public static void main(String[] args) {
        List<Map> data = new ArrayList<Map>();
        initData(data);
        System.out.println(data);
        SequenceUtils.sort("1", "rate", data);
        System.out.println(data);
    }

    友情链接

  • 相关阅读:
    【VB/.NET】Converting VB6 to VB.NET 【Part II】【之一】
    ubuntu常用命令
    mkfifo()函数
    截图留念,“万能数据库查询分析器”作为关键字在百度和谷歌上的海量搜索结果
    vc ado 生僻使用
    [HTML5SVG]JavaScript 的新领域 动态图片处理(SVG)
    中国离“过多福利”还有多远?
    mysql 修改列为not null报错Invalid use of NULL value
    内存泄漏与内存溢出的区别
    mysql ”Invalid use of null value“ 解决方法
  • 原文地址:https://www.cnblogs.com/huhx/p/baseJavaComparators.html
Copyright © 2011-2022 走看看