java - 根据所有最高数字排序

标签 java sorting

我想从所有表中找出具有最高值的人。下面是我从数据库中检索的示例

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) 作为排序输出。我该如何进行排序?

最佳答案

尝试这样的事情:

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;
}

Note: I have a separate method sortByValues() to do the comparison. This makes code neat to read and reusable rather than implementing an anonymous block after try-catch.

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

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

创建链接的 HashMap 以存储对

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

创建一个 Arraylist里面的物体 while循环存储从数据库中获取的每个值。它的作用域在此循环中消亡。

map.put(id, li);

Map<String, List<Integer>> 格式添加每个用户 ID 和值

map = sortByValues(map);

访问静态 sortByValues()根据其具有的值获取排序的 map 。

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

覆盖 Comparatorcompare()匿名并根据值执行排序。它汇总每个 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]

关于java - 根据所有最高数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38260763/

相关文章:

algorithm - 使用枢轴中间元素在最坏情况下快速排序复杂性

linux - 选择共享某些列(但不是全部)的行

java - PGP,验证证书上的签名

java - ContextClassLoader 没有 Hook

java - JPA找不到新创建的对象

C++,根据另一个 vector 对一个 vector 进行排序

c# - 使用锦标赛括号查找最小数字

PHP - 按键长度对哈希数组进行排序

java - Maven 将 applicationContext.xml 从 src/main/resources 复制到 target/myproject/WEB-INF

java - 向 Opennlp 提供名称列表