Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Javaで優先順位をつけて複数のキーでソートする方法

スポンサードリンク

f:id:fa11enprince:20150727234208j:plain
久々にPureなJavaを書きました(*´Д`)

複数のキーでソートする書き方の説明

いろいろ書き方はありますが、
対象のクラスにComparableをimplementsして
compareTo()をオーバーライドすると
ソート順を定義できます。
そのうえで、

-1(左が先)
 0(同じ)
 1(右が先)

の値を返してやればいいのですが、
複数ある時は、
第1条件の判定結果を変数に格納してやり、
それで0の時は第2条件を判定、
さらに0の時は第3条件を判定……
さらに0の時は第4条件を判定……
とすると、第1条件、第2条件、第3条件………の順でソートされます。

ちなみに並び順を変えたいときは定数なり、enumなりでcompareTo()の中を
分岐させる……しかないと思います。ほかに方法あるの???
とりあえず、説明より見たほうが早いと思うので、久々にGistからコードを貼ります。

サンプルコード

表示されない場合は、ブラウザをリロードしてみてください。

実行結果

学年 [1] クラス [A] 名前 [ Elenor Batorwski    ] 
学年 [1] クラス [B] 名前 [ Devon Woodcomb      ] 
学年 [2] クラス [A] 名前 [ Sarah Walker        ] 
学年 [2] クラス [A] 名前 [ Jon Casey           ] 
学年 [2] クラス [A] 名前 [ Chales Bartowski    ] 班長
学年 [2] クラス [B] 名前 [ Morgan Grimes       ] 
学年 [3] クラス [A] 名前 [ Lauren Cohan        ] 班長
学年 [4] クラス [A] 名前 [ Linda Hamilton      ] 
学年 [4] クラス [A] 名前 [ Nicole Richie       ] 
学年 [5] クラス [A] 名前 [ Tony Todd           ] 班長
学年 [5] クラス [A] 名前 [ Matthew Bomer       ] 
学年 [5] クラス [B] 名前 [ Rachel Bilson       ] 班長
学年 [6] クラス [A] 名前 [ Robin Givens        ] 班長
学年 [6] クラス [A] 名前 [ Richard Burgi       ] 
学年 [6] クラス [B] 名前 [ Agatha Christie     ] 班長
------------------------------------------------
学年 [6] クラス [A] 名前 [ Robin Givens        ] 班長
学年 [6] クラス [A] 名前 [ Richard Burgi       ] 
学年 [6] クラス [B] 名前 [ Agatha Christie     ] 班長
学年 [5] クラス [A] 名前 [ Tony Todd           ] 班長
学年 [5] クラス [A] 名前 [ Matthew Bomer       ] 
学年 [5] クラス [B] 名前 [ Rachel Bilson       ] 班長
学年 [4] クラス [A] 名前 [ Linda Hamilton      ] 
学年 [4] クラス [A] 名前 [ Nicole Richie       ] 
学年 [3] クラス [A] 名前 [ Lauren Cohan        ] 班長
学年 [2] クラス [A] 名前 [ Sarah Walker        ] 
学年 [2] クラス [A] 名前 [ Jon Casey           ] 
学年 [2] クラス [A] 名前 [ Chales Bartowski    ] 班長
学年 [2] クラス [B] 名前 [ Morgan Grimes       ] 
学年 [1] クラス [A] 名前 [ Elenor Batorwski    ] 
学年 [1] クラス [B] 名前 [ Devon Woodcomb      ] 
------------------------------------------------

あとがき

けっこうこういうコード書くはずなのだけど、ぐぐってもほとんど出てこなかったので書きました。
っていうかあれか、たいていDBから取ってくるときに既にソートして取ってるから
そのあと並び替えするなんてことあんまりしないですよね。
本当はStrategyパターンを書きたかったのですが、前書きで終了してしまいました。
次はStrategyパターンを書きます。
あれ?Javaってこんなに冗長だっけ?って感じです。
まぁ、IDEの支援があるからそんなに苦にはならないのだけれども……。

getter/setterどうにかならんのか…標準で。
lombokというのを使うと幸せになれるとかなんとか。
あと、オートボクシングとかいいから、プリミティブ型でメソッド使わせてくれ……。
あと今回は使ってませんが、 ? extends hogeとか忘れてしまった……。
人は忘れる生き物ですね。
……もしかしたら最新のJavaは何かしてくれてるかもしれない。
最近のJavaはStreamがすごいとかいうのを聞いているだけで何も知りません……