使えるのでやってみよう。このような比較関数(クラス)は他の言語でもよくあるので、移植もしやすい。連想配列(Map)でのソートと全く同じ構成となる。100上記の例では1つのクラスでまとめてしまったため、型パラメーターの制約を複数書いてしまっているが、値のみ(V)・キーのみ(K)とわかっているなら、制約はどちらかだけでも良い。版でもできると思うが、1つのクラスにまとめた利点としては、プロパティなどを追加して、いつでもソート方法を変更できる・同じソート方法を共有できること等にある。用途に合わせて使い分けるのも良いだろう。オーバーロードされている。連想配列をソートするような感じになる。降順ソートすると結果は以下のようになる。72ソートのキーとなる配列と値の配列(項目に対応する配列)は別々に作るので、型に自由が利くのが特徴だ。値の配列は何でも良いので、クラスや構造体の配列などをソートすることもできる。普段はクラスや構造体でデータを保持しておいて、ソートしたいときだけキーとなる配列を生成する等もできるだろう。しなくて済むので実行速度がはやくなる。工夫してみると良いだろう。[edit]今までのサンプルコードにも散々使ってるけど、少し複雑なものになると書くのが結構大変なので、テンプレ用にまとめてみようと思った。調べてみたら意外と使われていない(?)んだよね。値をあらかじめセットしておくグローバルな初期化のみでやってみる。ローカルの場合はブロック表記「{~}」が不要なだけで、基本的には同じ。リストを配列化したもの(List[])、連想配列(Map)もついでにやってみよう。32次元での初期化も同じように書ける。9例をグローバル変数にしたのは、初期化ブロック(「{~}」で囲まれた部分)というものが使えるというのを説明するためだ。ローカル変数なら必要ない。連番とか計算値をあらかじめ入れておくのには良い。内容的には全く同じものになる。9静的(static)な変数やメソッドとして使いたい場合は、ブロック自体に「static」を書くと良い(クラス共通となる)。次にリスト(List)を初期化してみよう。「{~}」が2重になるが、メソッドを使った初期化もできる。ループなどで追加しても良いだろう。「@SuppressWarnings()」は警告を消しているだけなので、無くても動く。リストの2次元(ネスト)も同じように考えればできる。中括弧「{~}」が多くなるが、ある程度まとめてしまえば、それほど難しくはないだろう。9通常の配列のときのように、連番や計算値などなら初期化ブロックを使うのも良いだろう。9リストと配列を絡めることもできる。長さが決まってるなら、通常の配列を使った方が実行速度が速いので、選択肢の1つとして考慮してみるのも良いだろう。構造的には配列の初期化とリストの初期化を混ぜあわせたものになる。隣接リストなどにも向いている気がする。9もちろん同じように、初期化ブロックを使っても良い。初期化ここまで見てれば、もう連想配列(Map)の初期化も想像がつくだろう。クラスで共通に使うなら静的な初期化ブロック「static」にするのも良い。9基本的には他のオブジェクトも同じ考え方でできるので、色々やってみると良いだろう。使えば勝手にやってくれる。集計など、値でのソートをしたいことも多い。e.getValue()));構造としてはキーと値のペア(Map.Entry)のリストを作り、そのリストをソートしている感じ。要素はオブジェクトの参照なので、キーでも値でも取り出せる。匿名クラスで作ってるが、「2次元配列のソート」のときのように、独立したクラスとして定義して置いて、フラグで昇順・降順を切り替えるのも良いだろう。キーを逆順(降順)ソートしたい場合は、同じような考え方でできる。間に挟むと、色々操作しやすい。システムっぽいのを作っていると、IDと値(文字列やオブジェクト)という組み合わせを使うことが多い。IDが連番のものなら普通の配列を使うことも多いんだけど、IDが飛び番号できるようにするには連想配列を使う。連想配列にはいくつか種類があるので、用途で使い分けるのが良いかもしれない。