TreeMap<Date, String>
などのキーを検索できるようにするための正しい方法は何でしょうNavigableMap<Date, String>
か?特定の月までにチェックして、その月のすべての月を出力したいのはどれですか?
たとえば、次のようになっている場合、2月のキーを持つすべてのユーザーを検索するにはどうすればよいですか?
Date date1 = dateformat.parse("8 January 2013");
NavigableMap
実装を使用している場合は、を呼び出しsubMap
て2つのキー間のマップのビューを取得できます。
DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy");
//using TreeMap for example
NavigableMap<Date, String> stringsByDate = new TreeMap<Date, String>();
//populate map
Date jan15th = dateFormat.parse("15 January 2013");
Date feb12th = dateFormat.parse("12 February 2013");
Date feb24th = dateFormat.parse("24 February 2013");
Date march18th = dateFormat.parse("18 March 2013");
stringsByDate.put(jan15th, "foo");
stringsByDate.put(feb12th, "bar");
stringsByDate.put(feb24th, "baz");
stringsByDate.put(march18th, "qux");
//define "from" and "to" keys
Date feb1st = dateFormat.parse("1 February 2013");
Date march1st = dateFormat.parse("1 March 2013");
//get the specified view
NavigableMap<Date, String> febStringsByDate = stringsByDate.subMap(
feb1st,
true, //include Feb 1st
march1st,
false //don't include March 1st
);
//prints {Tue Feb 12 00:00:00 EST 2013=bar, Sun Feb 24 00:00:00 EST 2013=baz}
System.out.println(febStringsByDate);
示されているように、呼び出しで使用される「from」キーと「to」キーsubMap
自体は、マップに含まれている必要はありません。
注:これは、特定の2月の日付(2013年2月など)でのみ機能します。2月のすべての日付のエントリが必要な場合は、年ごとに繰り返し、結果を統合する必要があります。
まず、Dateは変更可能であり、変更可能なオブジェクトをMapのキーとして使用することはお勧めしません。
しかし、あなたの質問に答えるには、マップ内のキーを繰り返し処理し、指定された基準に対して各キーをチェックする必要があります。DateをCalendar
クラスにラップして、日、月、年、および...の比較を容易にすることができます。
同じ問題が発生しただけで、なぜ機能しないのかを理解するのに少し時間がかかりました。
日付が同じであっても、異なる個々のDateオブジェクトのハッシュを比較するだけです。
次のデータ構造を使用しようとしています
SortedMap<Date,List<String>>
ただし、map.get(date)は、同じ日付がすでに存在する場合でも常にnullを返すため、そのリストに複数のメンバーを追加することはできません。