我想让所有表中的人都具有最高的价值。下面是我从数据库检索的示例
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;
}
注意:我有一个单独的方法
sortByValues()
进行比较。这使得代码易于阅读和重用,而不是在try-catch
之后实现匿名块。这里发生了什么事?
我们的目的是按照从数据库中获取的不同值对ID进行排序。我觉得
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
的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]