登录

java-web - java map排序

需求是这样的:

现在有一个list,里面n个map,每个map都有m大小的key-value,且每个map的key的顺序都是一样的,比如说map1的第x个key是y,那么mapn的第x个key也是y。

现在要对list中的每个map进行排序,要按n个map中的相同的key的value值的和的顺序排序。

举例:比如3个map,都有key1,key2,如果
map1.get(key2) + map2.get(key2) + map3.get(key2) > map1.get(key1) + map2.get(key1) + map3.get(key1),
那么就要将这三个map中的key的顺序按照key2,key1的顺序排列,原先每个map中key的顺序是key1,key2。

怎么来实现呢

# Java
PHP中文网PHP中文网2147 天前544 次浏览

全部回复(2) 我要回复

  • 高洛峰

    高洛峰2017-04-17 12:02:25

    1.先算出所有key的和的排序
    2.对原来的list进行遍历,根据key对应的顺序,之后放到一个list中

    List<String> sortedKeys = ...; // 第一步算的结果
    List<Map<String, Integer>> originList = ...; // 原始数据集合
    List<Map<String, Integer>> resultList = new ArrayList<Map<String, Integer>>();
    
    for(Map<String,Integer> originMap : originList) {
        Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
        for(String sortedKey : sortedKeys) {
            sortedMap.put(sortedKey, originMap.get(sortedKey));
        }
        resultList.put(sortedMap);
    }
    

    回复
    0
  • 黄舟

    黄舟2017-04-17 12:02:25

    有序 Map 可以用 TreeMap 来实现,所以我在示例中用的 java.util.TreeMap

    一般 SortedMap 都可以用一个 Comparator 作为构建参数,那么你可以自己写一个 Comparator 来实现排序,下面就是例子

    import java.util.*;
    
    public class Test {
        private SortedMap<String, Integer> first;
        private SortedMap<String, Integer> second;
        private SortedMap<String, Integer> third;
        private SortedMap<String, String> main;
    
        public Test() {
            first = new TreeMap<String, Integer>();
            second = new TreeMap<String, Integer>();
            third = new TreeMap<String, Integer>();
            main = new TreeMap<String, String>(new Comparator<String>() {
                public int compare(String k1, String k2) {
                    Integer v1 = first.get(k1) + second.get(k1) + third.get(k1);
                    Integer v2 = first.get(k2) + second.get(k2) + third.get(k2);
                    return v2 - v1;
                }
            });
        }
    
        public void put(String key, String value, Integer v1, Integer v2, Integer v3) {
            first.put(key, v1);
            second.put(key, v2);
            third.put(key, v3);
            main.put(key, value);
        }
    
        public SortedMap<String, String> getMain() {
            return main;
        }
    
        public static void main(String[] args) {
            Test test = new Test();
            test.put("a", "aaaaaaaa", 1, 2, 3);
            test.put("b", "bbbbbbbb", 10, 20, 30);
            test.put("c", "cccccccc", 5, 15, 20);
            test.put("d", "dddddddd", 100, 1, 3);
    
            for (Map.Entry<String, String> entry : test.getMain().entrySet()) {
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
        }
    }
    

    回复
    0
  • 取消回复发送