Java排序和合并

时间:2013-09-13 17:34:30

标签: java sorting collections

我有一个类似

的表格
ID  RANK  NAME 
--- ----- -----
1   1     abc
1   2     def
1   4     xyz
2   1     pqr
2   5     def
2   3     stu

ID列代表了一组数据。群组可以共享具有不同等级的通用名称。我使用查询

合并并排序上表
  SELECT MAX(RANK) R, NAME
    FROM TAB
   WHERE ID in (1,2)
GROUP BY NAME
ORDER BY R

获取公共名称合并为单行的结果,并按等级排序(如果两行共享同一名称,则为最大排名)

R     NAME 
----  ----- 
1     abc
1     pqr
3     stu
4     xyz
5     def

现在,如果我根据java中的每个id检索两个结果集,而不是从db获取这个组合结果,那么在java中合并和排序它们的最有效方法是什么?

1 个答案:

答案 0 :(得分:0)

如果使用类Entity来存储结果集的行,则可以使用以下方法mergeAndSort以相同的方式合并和排序实体,如上面的SQL语句中所示

final class Entity {
    private final int rank;
    private final String name;
    public Entity(int rank, String name) {
        this.rank = rank;
        this.name = name;
    }
    public int getRank() { return rank; }
    public String getName() { return name; }
}

public static List<Entity> mergeAndSort(List<Entity> entities) {
    Map<String, Entity> map = new HashMap<>();
    for (Entity current : entities) {
        Entity previous = map.get(current.getName());
        if (previous == null || previous.getRank() < current.getRank()) {
            map.put(current.getName(), current);
        }
    }
    List<Entity> result = new ArrayList<>(map.values());
    Collections.sort(result, new Comparator<Entity>() {
            public int compare(Entity lhs, Entity rhs) {
                return Integer.compare(lhs.getRank(), rhs.getRank());
            }
        });
    return result;
}