根据所有最高的数字排序

时间:2016-07-08 07:04:59

标签: java sorting

我希望从所有表中获得具有最高值的人。下面是我从db

中检索的示例
Id  play(count) listen(count) display(count) comment(count)
a   3           1             4              2
b   2           5             3              7
c   6           3             0              1
d   0           0             5              4
e   6           4             8              9
f   4           2             5              7

在所有与同一个id相关但来自不同表格的计数中。我希望 e(6,4,8,9)作为排序输出。我怎么做这个排序?

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

Map<String, List<Integer>> map = new LinkedHashMap<>();

    // Assuming that you are working with query output resultset
    try {
        stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);

        while (rs.next()) {
            List<Integer> li = new ArrayList<>();
            li.add(rs.getInt("PLAY"));
            li.add(rs.getInt("LISTEN"));
            li.add(rs.getInt("DISPLAY"));
            li.add(rs.getInt("COMMENT"));

            map.put(rs.getString("ID"), li);
        }

    } catch (SQLException e ) {
        /* SQLException handler */
    } finally {
        if (stmt != null) { stmt.close(); }
    }

    map = sortByValues(map);

    for (Map.Entry<String, List<Integer>> entry: map.entrySet()) {
        System.out.println(entry.getKey() + "," + entry.getValue());
    }

}

public static Map<String, List<Integer>> sortByValues(Map<String, List<Integer>> map) {

    List<Map.Entry<String, List<Integer>>> list = 
        new LinkedList<>(map.entrySet());

    Collections.sort(list, new Comparator<Map.Entry<String, List<Integer>>>()        {        

        public int compare(Map.Entry<String, List<Integer>> m1, Map.Entry<String, List<Integer>> m2) {

            int sum1 = 0;
            for(Integer d : m1.getValue())
                sum1 += d;

            int sum2 = 0;
            for(Integer d : m2.getValue())
                sum2 += d;

            return (new Integer(sum2)).compareTo(new Integer(sum1));
        } 
    }) ;

    Map<String, List<Integer>> result = new LinkedHashMap<>();
    for (Map.Entry<String, List<Integer>> entry: list) {
        result.put(entry.getKey(), entry.getValue());
    }

    return result;
}
  

注意:我有一个单独的方法sortByValues()来进行比较。这使得代码整齐可读并可重用,而不是在try-catch之后实现匿名阻止。

这里发生了什么? 我们的目标是按照从数据库中获取的不同值对ID进行排序。我认为Map数据结构在这里是恰当的。示例Map以通用方式表示为Map<String, List<Integers>>

Map<String, List<Integer>> map = new LinkedHashMap<>();

创建链接的哈希映射以存储该对

List<Integer> li = new ArrayList<>();

Arraylist循环内创建一个while对象,以存储从数据库中获取的每个值。它的范围在这个循环中消失。

map.put(id, li);

Map<String, List<Integer>>

格式添加每个用户ID和值
map = sortByValues(map);

访问静态sortByValues()以根据其拥有的值获取已排序的地图。

sortByValues(Map<String, List<Integer>> map) 

匿名覆盖Comparator&#39; compare()并根据值执行排序。它总结了每个ID的值并进行比较。

模拟执行:

Map<String, List<Integer>> map = new LinkedHashMap<>();
        // Map<String, List<Integer>> map = new HashMap<>();
        List<Integer> li = new ArrayList<>();
        li.add(1);
        li.add(2); 
        li.add(3);
        // MathUtils.sum()
        map.put("a", li);
        // map.put("a", 5);

        List<Integer> li2 = new ArrayList<>();
        li2.add(3);
        li2.add(-1); 
        li2.add(1);
        map.put("b", li2);


        List<Integer> li3 = new ArrayList<>();
        li3.add(10);
        li3.add(-1); 
        li3.add(9);
        map.put("c", li3);

        map = sortByValues(map);

        for (Map.Entry<String, List<Integer>> entry: map.entrySet()) {
            System.out.println(entry.getKey() + "," + entry.getValue());
        }

结果:

c,[10, -1, 9]
a,[1, 2, 3]
b,[3, -1, 1]