我想从所有表中找出具有最高值的人。下面是我从数据库中检索的示例
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 aftertry-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)
覆盖 Comparator
的 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]
关于java - 根据所有最高数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38260763/