- 2021/07/11 【C#】配列やコレクションの IsNullOrEmpty
- 2021/06/13 【C#】HashSet や Dictionary の AddRange
- 2016/12/07 【C#】連想配列(Dictionary)を値 or キーでソート
- 2015/12/06 【Java】配列, リスト(List), 連想配列(Map) の初期化
- 2015/04/19 【Java】連想配列(Map)を値でソートする
« prev next »
【C#】配列やコレクションの IsNullOrEmpty 
2021/07/11 Sun [edit]
ああ、そう言えば「配列 や List の TryGetValue」やったのに、もっとよく使うもの忘れてたな~、と思い出したので、とても簡単なものだが、あると非常に便利ものなので一応書いておこう。
これは文字列で string.IsNullOrEmpy() をよく使うので、同じような感覚で、配列や List 等が null または 空 (Count = 0) でないかを調べるものがあれば、便利なのにな~と思ったので、昔作ったものだ。実際にあまりに頻繁に使うので、標準関数かと思い違いしてしまうほどだ(笑)。
まぁたぶん、皆似たようなものを作ってる気がするが、まだ勉強しはじめたばかりの人もいるかもなので(面白いことに、もう随分たくさんの記事を書いたが、上級者向けより、初心者向けの記事の方がアクセスは多いものなのだ)、役に立つかはわからないが、とりあえず書いておこう。
●配列やコレクションの IsNullOrEmpty
using System;
using System.Collections.Generic;
public static class Extensions //名前は任意
{
/// <summary>
/// コレクションが null または Count = 0 か?
/// 2021/07/11 Fantom
/// http://fantom1x.blog130.fc2.com/blog-entry-399.html
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="collection">調べるコレクション</param>
/// <returns>true : null または Count = 0</returns>
public static bool IsNullOrEmpty<T>(this ICollection<T> collection)
{
return collection == null || collection.Count == 0;
}
/// <summary>
/// 配列が null または Length = 0 か?
/// 2021/07/11 Fantom
/// http://fantom1x.blog130.fc2.com/blog-entry-399.html
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array">調べる配列</param>
/// <returns>true : null または Length = 0</returns>
public static bool IsNullOrEmpty<T>(this T[] array)
{
return (array == null || array.Length == 0);
}
}
●メインコード例
using System;
using System.Collections.Generic;
var emptyList = new List();
var list = new List() { 1, 2, 3 };
Console.WriteLine("emptyList : " + emptyList.IsNullOrEmpty());
Console.WriteLine("list : " + list.IsNullOrEmpty());
var emptyDic = new Dictionary();
var dic = new Dictionary()
{
{ "hoge", 100 },
{ "fuga", 200 },
};
Console.WriteLine("emptyDic : " + emptyDic.IsNullOrEmpty());
Console.WriteLine("dic : " + dic.IsNullOrEmpty());
var emptySet = new HashSet();
var set = new HashSet() { "hoge", "fuga" };
Console.WriteLine("emptySet : " + emptySet.IsNullOrEmpty());
Console.WriteLine("set : " + set.IsNullOrEmpty());
var emptyArray = new string[0];
var array = new string[] { "apple", "banana", "candy" };
Console.WriteLine("emptyArray : " + emptyArray.IsNullOrEmpty());
Console.WriteLine("array : " + array.IsNullOrEmpty());
list : False
emptyDic : True
dic : False
emptySet : True
set : False
emptyArray : True
array : False
これも本当になんてことないものなんだけどね。できればこれも標準関数に欲しいくらい(笑)。
私はこれに NOT値(反転値)を求める IsExist() みたいな定義も加えて、よく使っている。
●!IsNullOrEmpty() (反転値) を返す IsExist()
//null でない、かつ Count > 0
public static bool IsExist(this ICollection collection) => !collection.IsNullOrEmpty();
//null でない、かつ Length > 0
public static bool IsExist(this T[] array) => !array.IsNullOrEmpty();
これは「if (!list.IsNullOrEmpty())」みたいなものを「if (list.IsExist())」と「!」を入れないで済むので、少しわかりやすくなるので重宝してる。まぁ、日本語でも「〇〇でなくはない」みたいな否定の否定って意味がわかりずらいからね。その辺は好みで(笑)。
(関連記事)
【C#】配列 や List の TryGetValue
【Unity】【C#】配列・リストのシャッフル
【C#】2次元配列(ジャグ配列・多次元配列)のソート
【C#】多次元配列とジャグ配列(2次元配列)のサイズ(長さ)、相互変換など
【C#】配列やListなどの中身(要素)を見る拡張メソッド Dump
【C#】HashSet や Dictionary の AddRange 
2021/06/13 Sun [edit]
前回に引き続き「標準関数にあったら良いな」シリーズ(笑)。
List には後から、要素を複数追加する AddRange() というメソッドがあるが、残念ながら、HashSet や Dictionary には無い。しかし、意外と複数の要素を追加したいときってあるんだよね。そんな時に便利な拡張メソッド。
●HashSet, Dictionary の AddRange
using System;
using System.Collections.Generic;
public static class Extensions //名前は任意
{
/// <summary>
/// 複数の要素を追加する(同じ値は上書きとなる)
/// ※null であっても、必ず生成される
/// 2021/06/13 Fantom
/// http://fantom1x.blog130.fc2.com/blog-entry-398.html
/// </summary>
/// <param name="set">追加先</param>
/// <param name="collection">追加ソース</param>
/// <returns></returns>
public static HashSet<T> AddRange<T>(this HashSet<T> set, IEnumerable<T> collection)
{
if (set == null)
set = new HashSet<T>();
if (collection != null)
{
foreach (var item in collection)
set.Add(item);
}
return set;
}
/// <summary>
/// 複数のキーと値ペアを追加する(同じキーは上書きとなる)
/// ※null であっても、必ず生成される.
/// 2021/06/13 Fantom
/// http://fantom1x.blog130.fc2.com/blog-entry-398.html
/// </summary>
/// <param name="dst">追加先</param>
/// <param name="src">追加ソース</param>
/// <returns></returns>
public static Dictionary<K, V> AddRange<K, V>(this Dictionary<K, V> dst, Dictionary<K, V> src)
{
if (dst == null)
dst = new Dictionary<K, V>();
if (src != null)
{
foreach (var item in src)
dst[item.Key] = item.Value;
}
return dst;
}
}
●メインコード例
using System;
using System.Collections.Generic;
using System.Linq;
var aSet = new HashSet<int>(Enumerable.Range(0, 5));
Console.WriteLine("Before : " + aSet.Dump());
var bSet = new HashSet<int>(Enumerable.Range(10, 5));
aSet.AddRange(bSet);
Console.WriteLine("After : " + aSet.Dump());
var cSet = new HashSet<int>(aSet).AddRange(bSet);
Console.WriteLine("c = a + b : " + cSet.Dump());
var aDic = new Dictionary<int, string>()
{
{ 0, "a" },
{ 1, "b" },
{ 2, "c" },
};
Console.WriteLine("Before : " + aDic.Dump());
var bDic = new Dictionary<int, string>()
{
{ 10, "x" },
{ 11, "y" },
{ 12, "z" },
};
aDic.AddRange(bDic);
Console.WriteLine("After : " + aDic.Dump());
var cDic = new Dictionary<int, string>(aDic).AddRange(bDic);
Console.WriteLine("c = a + b : " + cDic.Dump());
After : [0, 1, 2, 3, 4, 10, 11, 12, 13, 14]
c = a + b : [0, 1, 2, 3, 4, 10, 11, 12, 13, 14]
Before : [[0, a], [1, b], [2, c]]
After : [[0, a], [1, b], [2, c], [10, x], [11, y], [12, z]]
c = a + b : [[0, a], [1, b], [2, c], [10, x], [11, y], [12, z]]
要素をダンプしている Dump() は以前の記事からコピペして欲しい。
少し標準関数の List.AddRange() と違うのは、void を返してるのではなく、コレクションを返してる所かな。こうすると、メソッドチェーンみたいにできるので、new と同時にいくつかの別コレクションを追加できたりするので、便利だ。
とても簡単なものだけど、これもあると非常に有用なんだよね。私は結構大きなシステムを自作してるけど、大きくなるほど、こういった便利関数は欠かせなくなる(毎回似たような処理を書くのは大変な物量になるため)。実はプログラミングってこういう小さな工夫の積み重ねなんだよね(笑)。
「これくらいのものなら、LINQ で書けばいいんじゃないの?」と思うかも知れないが、私はあまりオススメしない。というのは LINQ はそれなりにコストがかかるのと、GC を発生しやすいので、頻繁に使われるかも知れない拡張メソッド等は、割とベタな書き方をした方が速いし、GC も制御しやすいからだ。まぁ、string 系の処理はどのみち GC が発生するので使うこともあるが(しかし、できる限り StringBuilder を使う方が良い)、LINQ はどちらかというと、ランタイムで1回きりの初期化処理とか、頻繁には使わない処理用かな。特に Unity のような毎フレーム更新するような処理には気をつけて使った方が良いね。
・コストのかかる操作を避ける
(関連記事)
【C#】配列 や List の TryGetValue
【C#】配列やListなどの中身(要素)を見る拡張メソッド Dump
【Unity】【C#】配列・リストのシャッフル
【C#】2次元配列(ジャグ配列・多次元配列)のソート
【C#】多次元配列とジャグ配列(2次元配列)のサイズ(長さ)、相互変換など
【C#】連想配列(Dictionary)を値 or キーでソート 
2016/12/07 Wed [edit]
このテーマはググればいくらでも出てくるので、どちらかというと自分用メモ。先に述べてしまうと、初めの LINQ 的な書き方が一番簡単だろう。ただ、他の方法もあったので、それも少しまとめてみた感じ。色々な書き方を知っておくと、他言語に移植するとき等にも役に立つからだ。
■KeyValuePair の List でのソート (ラムダ式)
■KeyValuePair の List でのソート (delegate)
■KeyValuePair の List でのソート (IComparer)
■キーと値の2つの配列でのソート
■IEnumerable でのソート (LINQ)
LINQ (System.Linq) が使えるなら、とりあえずこれを使うのが一番楽だろう。内容的には Enumerable(IEnumerable) を使うことになる。キーでのソートも、値でのソートもプロパティを変えるだけで同様にできる。
●値でのソート (IEnumerable)
using System;
using System.Collections.Generic;
using System.Linq;
Dictionary<string, int> dic = new Dictionary<string, int>() {
{ "Becky", 85 },
{ "Daisy", 72 },
{ "Alice", 95 },
{ "Eliza", 78 },
{ "Cindy", 100 },
};
var sorted = dic.OrderBy((x) => x.Value); //昇順
//var sorted = dic.OrderByDescending((x) => x.Value); //降順
foreach (var v in sorted)
{
Console.WriteLine(v.Key + " => " + v.Value);
}
Eliza => 78
Becky => 85
Alice => 95
Cindy => 100
コメントアウトの方は降順になる。キーでのソートはソート対象を変えるだけで良い(x.Value → x.Key に変更)。
●キーでのソート (IEnumerable)
var sorted = dic.OrderBy((x) => x.Key); //昇順
//var sorted = dic.OrderByDescending((x) => x.Key); //降順
Becky => 85
Cindy => 100
Daisy => 72
Eliza => 78
■KeyValuePair の List でのソート (ラムダ式)
これはキーと値のペア(KeyValuePair)のリストを作って、それをソートする方法だ。他の言語でもよく使われる方法なので、覚えておくと役に立つ。List.Sort() はラムダ式が使えるようなので、簡潔に書くことも可能だ。
●値でのソート (KeyValuePair の List と ラムダ式)
using System;
using System.Collections.Generic;
Dictionary<string, int> dic = new Dictionary<string, int>() {
{ "Becky", 85 },
{ "Daisy", 72 },
{ "Alice", 95 },
{ "Eliza", 78 },
{ "Cindy", 100 },
};
List<KeyValuePair<string, int>> list = new List<KeyValuePair<string, int>>(dic);
list.Sort((a, b) => a.Value - b.Value); //昇順
//list.Sort((a, b) => b.Value - a.Value); //降順
foreach (var v in list)
{
Console.WriteLine(v.Key + " => " + v.Value);
}
Eliza => 78
Becky => 85
Alice => 95
Cindy => 100
コメントアウトの方は降順になる。キーでのソートはソート対象を変えるだけで良い(x.Value → x.Key に変更)。なお、比較には CompareTo() を使っている。
●キーでのソート (KeyValuePair の List と ラムダ式)
list.Sort((a, b) => a.Key.CompareTo(b.Key)); //昇順
//list.Sort((a, b) => b.Key.CompareTo(a.Key)); //降順
Becky => 85
Cindy => 100
Daisy => 72
Eliza => 78
■KeyValuePair の List でのソート (delegate)
これは上記のラムダ式版の別表記と言っても良いのだが、改めて delegate を使えると覚えておくと、例えば、リアルタイムにソート方法を変更するような実装もできると考えることができる。まぁ、引き出しは多いことに越したことはない。
●値でのソート (KeyValuePair の List と delegate)
using System;
using System.Collections.Generic;
Dictionary<string, int> dic = new Dictionary<string, int>() {
{ "Becky", 85 },
{ "Daisy", 72 },
{ "Alice", 95 },
{ "Eliza", 78 },
{ "Cindy", 100 },
};
List<KeyValuePair<string, int>> list = new List<KeyValuePair<string, int>>(dic);
list.Sort(delegate(KeyValuePair<string, int> a, KeyValuePair<string, int> b) {
return a.Value - b.Value; //昇順
//return b.Value - a.Value; //降順
});
foreach (var v in list)
{
Console.WriteLine(v.Key + " => " + v.Value);
}
Eliza => 78
Becky => 85
Alice => 95
Cindy => 100
コメントアウトの方は降順になる。キーでのソートはソート対象を変えるだけで良い(x.Value → x.Key に変更)。なお、比較には CompareTo() を使っている。
●キーでのソート (KeyValuePair の List と delegate)
list.Sort(delegate(KeyValuePair<string, int> a, KeyValuePair<string, int> b) {
return a.Key.CompareTo(b.Key); //昇順
//return b.Key.CompareTo(a.Key); //降順
});
Becky => 85
Cindy => 100
Daisy => 72
Eliza => 78
■KeyValuePair の List でのソート (IComparer)
ICompare(Comparer) も使えるのでやってみよう。このような比較関数(クラス)は他の言語でもよくあるので、移植もしやすい。ちなみに以前書いた Java での連想配列(Map)でのソートと全く同じ構成となる。
●値(or キー)でのソート (KeyValuePair の List と IComparer)
using System;
using System.Collections.Generic;
public static void Main()
{
Dictionary<string, int> dic = new Dictionary<string, int>() {
{ "Becky", 85 },
{ "Daisy", 72 },
{ "Alice", 95 },
{ "Eliza", 78 },
{ "Cindy", 100 },
};
List<KeyValuePair<string, int>> list = new List<KeyValuePair<string, int>>(dic);
list.Sort(new MyComparer<string, int>());
foreach (var v in list)
{
Console.WriteLine(v.Key + " => " + v.Value);
}
}
//比較クラス(関数)
public class MyComparer<K,V> : IComparer<KeyValuePair<K,V>>
where K : IComparable
where V : IComparable
{
public int Compare(KeyValuePair<K,V> a, KeyValuePair<K,V> b) {
return a.Value.CompareTo(b.Value); //値 昇順
//return b.Value.CompareTo(a.Value); //値 降順
//return a.Key.CompareTo(b.Key); //キー 昇順
//return b.Key.CompareTo(a.Key); //キー 降順
}
}
Eliza => 78
Becky => 85
Alice => 95
Cindy => 100
上記の例では1つのクラスでまとめてしまったため、型パラメーターの制約を複数書いてしまっているが、値のみ(V)・キーのみ(K)とわかっているなら、制約はどちらかだけでも良い。同じようなことは delegate 版でもできると思うが、1つのクラスにまとめた利点としては、プロパティなどを追加して、いつでもソート方法を変更できる・同じソート方法を共有できること等にある。用途に合わせて使い分けるのも良いだろう。
■キーと値の2つの配列でのソート
もう1つ、今回の連想配列のテーマからは少し外れるのだが、C# には「ソート対象となる1次元配列と、その項目に対応する別の1次元配列」をソートできる Array.Sort(Array, Array) がオーバーロードされている。まるで連想配列をソートするような感じになる。
●キーと値の2つの配列でのソート
using System;
using System.Collections.Generic;
public static void Main()
{
string[] name = {"Alice", "Becky", "Cindy", "Daisy", "Eliza"};
int[] value = {95, 85, 100, 72, 78};
Array.Sort(value, name); //昇順
//Array.Sort(value, name, new RevComparer<int>()); //降順
for (int i = 0; i < value.Length; i++)
{
Console.WriteLine(name[i] + " => " + value[i]);
}
}
//逆順(降順)
public class RevComparer<T> : IComparer<T> where T : IComparable
{
public int Compare(T a, T b) {
return b.CompareTo(a); //降順
}
}
Eliza => 78
Becky => 85
Alice => 95
Cindy => 100
引数は Array.Sort(ソート対象の配列, 対応する配列, [IComparer]) となっている。
ちなみに、コメントアウトされている「RevComparer」(逆順用 Comparer) で降順ソートすると結果は以下のようになる。
Alice => 95
Becky => 85
Eliza => 78
Daisy => 72
ソートのキーとなる配列と値の配列(項目に対応する配列)は別々に作るので、型に自由が利くのが特徴だ。値の配列は何でも良いので、クラスや構造体の配列などをソートすることもできる。普段はクラスや構造体でデータを保持しておいて、ソートしたいときだけキーとなる配列を生成する等もできるだろう。
Comparer(RevComparer)などもあらかじめ static で作っておけば(int など利用頻度が高い型を別に作っておけば)、毎回 new しなくて済むので実行速度がはやくなる。色々工夫してみると良いだろう。
(関連記事)
【C#】2次元配列(ジャグ配列・多次元配列)のソート
【C#】多次元配列とジャグ配列(2次元配列)のサイズ(長さ)、相互変換など
【Java】配列, リスト(List), 連想配列(Map) の初期化 
2015/12/06 Sun [edit]
今までのサンプルコードにも散々使ってるけど、少し複雑なものになると書くのが結構大変なので、テンプレ用にまとめてみようと思った。調べてみたら意外と使われていない(?)んだよね。ただし、あくまで値をあらかじめセットしておくグローバルな初期化のみでやってみる。ローカルの場合はブロック表記「{~}」が不要なだけで、基本的には同じ。
よく使う例として、リスト(List) と リストを配列化したもの(List[])、連想配列(Map)もついでにやってみよう。
●1次元配列の初期化 : int[]
public class ArrayInitTest {
int[] arr = {1, 2, 3};
public static void main(String[] args) throws Exception {
new ArrayInitTest();
}
public ArrayInitTest() {
for (int v : arr) {
System.out.print(v + " ");
}
}
}
2次元での初期化も同じように書ける。
●2次元配列の初期化 : int[][]
public class ArrayInitTest {
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
public static void main(String[] args) throws Exception {
new ArrayInitTest();
}
public ArrayInitTest() {
for (int[] is : arr) {
for (int v : is) {
System.out.print(v + " ");
}
System.out.println();
}
}
}
4 5 6
7 8 9
例をグローバル変数にしたのは、初期化ブロック(「{~}」で囲まれた部分)というものが使えるというのを説明するためだ。もちろんローカル変数なら必要ない。連番とか計算値をあらかじめ入れておくのには良い。内容的には全く同じものになる。
●初期化ブロックを使った、2次元配列の初期化 : int[][]
public class ArrayInitTest {
int[][] arr = new int[3][3];
{
for (int i = 0, p = 1; i < 3; i++) {
for (int j = 0; j < 3; j++) {
arr[i][j] = p++;
}
}
}
public static void main(String[] args) throws Exception {
new ArrayInitTest();
}
public ArrayInitTest() {
for (int[] is : arr) {
for (int v : is) {
System.out.print(v + " ");
}
System.out.println();
}
}
}
4 5 6
7 8 9
静的(static)な変数やメソッドとして使いたい場合は、ブロック自体に「static」を書くと良い(クラス共通となる)。
●静的初期化ブロックを使った、2次元配列の初期化 : static int[][]
public class ArrayInitTest {
static int[][] arr = new int[3][3];
static {
for (int i = 0, p = 1; i < 3; i++) {
for (int j = 0; j < 3; j++) {
arr[i][j] = p++;
}
}
}
public static void main(String[] args) throws Exception {
for (int[] is : arr) {
for (int v : is) {
System.out.print(v + " ");
}
System.out.println();
}
}
}
4 5 6
7 8 9
- - - - - - - - - - - - - - - - - -
■リスト(List) の初期化
次にリスト(List)を初期化してみよう。「{~}」が2重になるが、メソッドを使った初期化もできる。
●リストの初期化 : List<E>
public class ListInitTest {
@SuppressWarnings("serial")
List<Integer> list = new ArrayList<Integer>(){
{
add(1); add(2); add(3);
}
};
public static void main(String[] args) throws Exception {
new ListInitTest();
}
public ListInitTest() {
for (int v : list) {
System.out.print(v + " ");
}
}
}
通常の配列と同じように、初期化ブロックを使って、for ループなどで追加しても良いだろう。「@SuppressWarnings()」は警告を消しているだけなので、無くても動く。
リストの2次元(ネスト)も同じように考えればできる。ちょっと中括弧「{~}」が多くなるが、ある程度まとめてしまえば、それほど難しくはないだろう。
●2次元のリスト(ネスト)の初期化 : List<List<E>>
public class ListInitTest {
@SuppressWarnings("serial")
List<List<Integer>> list = new ArrayList<List<Integer>>(){{
add(new ArrayList<Integer>(){{
add(1); add(2); add(3);
}});
add(new ArrayList<Integer>(){{
add(4); add(5); add(6);
}});
add(new ArrayList<Integer>(){{
add(7); add(8); add(9);
}});
}};
public static void main(String[] args) throws Exception {
new ListInitTest();
}
public ListInitTest() {
for (List<Integer> li : list) {
for (int is : li) {
System.out.print(is + " ");
}
System.out.println();
}
}
}
4 5 6
7 8 9
通常の配列のときのように、連番や計算値などなら初期化ブロックを使うのも良いだろう。
●初期化ブロックを使った、2次元のリスト(ネスト)の初期化 : List<List<E>>
public class ListInitTest {
List<List<Integer>> list = new ArrayList<List<Integer>>();
{
for (int i = 0, p = 1; i < 3; i++) {
list.add(new ArrayList<Integer>());
for (int j = 0; j < 3; j++) {
list.get(i).add(p++);
}
}
}
public static void main(String[] args) throws Exception {
new ListInitTest();
}
public ListInitTest() {
for (List<Integer> li : list) {
for (int is : li) {
System.out.print(is + " ");
}
System.out.println();
}
}
}
4 5 6
7 8 9
リストと配列を絡めることもできる。長さが決まってるなら、通常の配列を使った方が実行速度が速いので、選択肢の1つとして考慮してみるのも良いだろう。構造的には配列の初期化とリストの初期化を混ぜあわせたものになる。隣接リストなどにも向いている気がする。
●配列化されたリストを初期化する : List<E>[]
public class ListInitTest {
@SuppressWarnings({ "rawtypes", "serial" })
List[] list = {
new ArrayList<Integer>(){{
add(1); add(2); add(3);
}},
new ArrayList<Integer>(){{
add(4); add(5); add(6);
}},
new ArrayList<Integer>(){{
add(7); add(8); add(9);
}},
};
public static void main(String[] args) throws Exception {
new ListInitTest();
}
public ListInitTest() {
for (List<Integer> li : list) {
for (int is : li) {
System.out.print(is + " ");
}
System.out.println();
}
}
}
4 5 6
7 8 9
もちろん同じように、初期化ブロックを使っても良い。
●初期化ブロックを使って、配列化されたリストを初期化する : List<E>[]
public class ListInitTest {
@SuppressWarnings("unchecked")
List<Integer>[] list = new List[3];
{
for (int i = 0, p = 1; i < list.length; i++) {
list[i] = new ArrayList<Integer>();
for (int j = 0; j < 3; j++) {
list[i].add(p++);
}
}
}
public static void main(String[] args) throws Exception {
new ListInitTest();
}
public ListInitTest() {
for (List<Integer> li : list) {
for (int is : li) {
System.out.print(is + " ");
}
System.out.println();
}
}
}
4 5 6
7 8 9
- - - - - - - - - - - - - - - - - -
■連想配列(Map) の初期化
ここまで見てれば、もう連想配列(Map)の初期化も想像がつくだろう。クラスで共通に使うなら静的な初期化ブロック「static」にするのも良い。
●連想配列(Map) の初期化 : Map<K, V>
public class MapInitTest {
@SuppressWarnings("serial")
Map<String, Integer> map = new TreeMap<String, Integer>() {
{
put("Candy", 6);
put("Eliza", 9);
put("Becky", 10);
put("Alice", 13);
put("Daisy", 99);
}
};
public static void main(String[] args) throws Exception {
new MapInitTest();
}
public MapInitTest() {
for (Map.Entry<String, Integer> e : map.entrySet()) {
System.out.println(e.getKey() + " = " + e.getValue());
}
}
}
Becky = 10
Candy = 6
Daisy = 99
Eliza = 9
基本的には他のオブジェクトも同じ考え方でできるので、色々やってみると良いだろう。
(関連記事)
【Java】2次元配列のソート
【Java】連想配列(Map)を foreach(for, forEach) で取り出す
【Java】連想配列(Map)を値でソートする
【Java】配列要素の反転(reverse)
【Android】【Java】SparseArray で foreach
【Java】連想配列(Map)を値でソートする 
2015/04/19 Sun [edit]
キーでのソート(昇順)は TreeMap を使えば勝手にやってくれる。しかし集計など、値でのソートをしたいことも多い。その場合はリストなどを中継し、Comparator で並び変えると良い。
●連想配列(Map)を値でソート(昇順/降順)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
//初期化
Map<String, Integer> map = new HashMap<String, Integer>(){ //TreeMap でも良い
{
put("Alice", 13);
put("Becky", 10);
put("Candy", 6);
put("Daisy", 99);
put("Eliza", 9);
}
};
//Map.Entry のリストを作る
List<Entry<String, Integer>> entries = new ArrayList<Entry<String, Integer>>(map.entrySet());
//Comparator で Map.Entry の値を比較
Collections.sort(entries, new Comparator<Entry<String, Integer>>() {
//比較関数
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()); //昇順
//return o2.getValue().compareTo(o1.getValue()); //降順
}
});
//確認用
for (Entry<String, Integer> e : entries) {
System.out.println(e.getKey() + " = " + e.getValue());
}
//Java 8 なら...
//entries.forEach(e -> System.out.println(e.getKey() + " = " + e.getValue()));

構造としてはキーと値のペア(Map.Entry)のリストを作り、そのリストをソートしている感じ。要素はオブジェクトの参照なので、キーでも値でも取り出せる。この例では Comparator を匿名クラスで作ってるが、「2次元配列のソート」のときのように、独立したクラスとして定義して置いて、フラグで昇順・降順を切り替えるのも良いだろう。
キーを逆順(降順)ソートしたい場合は、同じような考え方でできる。
●連想配列(Map)をキーで降順ソート
//キーのリストを作る
List<String> keylist = new ArrayList<String>(map.keySet());
//Comparator でキーを降順ソート
Collections.sort(keylist, new Comparator<String>() {
//比較関数
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
//確認用
for (String key : keylist) {
System.out.println(key + " = " + map.get(key));
}
//Java 8 なら...
//keylist.forEach(e -> System.out.println(e + " = " + map.get(e)));

昇順なら Collections.sort(keylist) だけで良いね(TreeMap なら必要ない)。いずれにしても連想配列は順番(連番)という概念はあまりないので、List などを間に挟むと、色々操作しやすい。
(関連記事)
【Java】連想配列(Map)を foreach(for, forEach) で取り出す
【Java】配列, リスト(List), 連想配列(Map) の初期化
【Android】【Java】SparseArray で foreach
【Java】2次元配列のソート
【Java】配列要素の反転(reverse)