0

TABのようなテーブルがあります

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

一般的な名前が 1 つの行にマージされ、ランク (2 つの行が同じ名前を共有する場合の最大ランク) で並べ替えられた結果を取得します。

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

データベースからこの結合された結果を取得する代わりに、Java で各 ID に基づいて 2 つの結果セットを取得する場合、それらを Java でマージしてソートする最も効率的な方法は何ですか?

4

1 に答える 1

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;
}
于 2013-09-13T18:27:18.647 に答える