3

TreeMap<Date, String>などのキーを検索できるようにするための正しい方法は何でしょうNavigableMap<Date, String>か?特定の月までにチェックして、その月のすべての月を出力したいのはどれですか?

たとえば、次のようになっている場合、2月のキーを持つすべてのユーザーを検索するにはどうすればよいですか?

Date date1 = dateformat.parse("8 January 2013");
4

3 に答える 3

8

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月のすべての日付のエントリが必要な場合は、年ごとに繰り返し、結果を統合する必要があります。

于 2013-01-08T06:13:16.990 に答える
2
  • まず、Dateは変更可能であり、変更可能なオブジェクトをMapのキーとして使用することはお勧めしません。

  • しかし、あなたの質問に答えるには、マップ内のキーを繰り返し処理し、指定された基準に対して各キーをチェックする必要があります。DateをCalendarクラスにラップして、日、月、年、および...の比較を容易にすることができます。

于 2013-01-08T06:27:32.230 に答える
0

同じ問題が発生しただけで、なぜ機能しないのかを理解するのに少し時間がかかりました。

日付が同じであっても、異なる個々のDateオブジェクトのハッシュを比較するだけです。

次のデータ構造を使用しようとしています

SortedMap<Date,List<String>>

ただし、map.get(date)は、同じ日付がすでに存在する場合でも常にnullを返すため、そのリストに複数のメンバーを追加することはできません。

于 2013-06-27T13:11:05.923 に答える