我希望从所有表中获得具有最高值的人。下面是我从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)作为排序输出。我怎么做这个排序?
答案 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>>
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]