一部のデータを日付範囲に整理する必要があります。一連の識別子があり、それぞれに有効な日付範囲があります。日付範囲は開始日と終了日で構成され、2 つの Date 要素のリストに保存します。最後にMap<Integer, List<List<Date>>>
、少し面倒に見える があります。この情報を保存するより良い方法はありますか?
4 に答える
グアバマルチマップを試すことができます
ListMultimap<Integer, List<Date>> mm = LinkedListMultimap.create();
一般的に言えば、クラスに分割できます。
class A {
Date from;
Date until;
}
class B {
List<A> list = ...
}
class C {
List<B> list = ...
}
もちろん意味のある名前で。したがって、マップで使用できC
ます。
いずれにせよ、おそらく各クラス レベルでメソッドを使用することになるので、後でこれらのメソッドの場所について心配する必要はありません。これらのメソッドもこの構造にうまく適合します。
以下を使用することをお勧めします。どちらも (主観的に) 見栄えがよく、ドメイン単位でより正確です。
Map<Integer, List<DateRange>>
DateRange
単純な場所は次のとおりです。
public class DateRange {
Date start;
Date end;
}
(修飾子を変更し、必要に応じてゲッター/セッター/メソッドを追加します)
おまけのヒント:java.util.Date
また、ほとんどの実際の日付タスクでjava.util.Calendar
は、使いにくく、常に明確に定義されているとは限らないことを指摘したいと思います。Joda timeの使用を検討することをお勧めします。たまたまInterval
、シナリオでうまく機能するはずのクラスがあります。
グアバやアパッチを含めることに興味がない場合の解決策は次のとおりです。
public class DateRange {
private final Date start;
private final Date end;
public DateRange(Date start, Date end) {
this.start = start;
this.end = end;
}
public boolean contains(Date date) {
// Use whatever comparison method is best
// for your particular date objects here
return date.compareTo(start) >= 0 && date.compareTo(end) <= 0);
}
// Getters, Setters if applicable, etc.
}
とてもMap<Integer, List<DateRange>>
読みやすいようです。さらに分解するには、Rene Links の回答DateRange
が示唆するように Identifier クラスを作成し、apache commons Range を次のように s のリストに置き換えるだけです。
public class Identifier {
private final int id;
private final List<DateRange> ranges;
public Identifier(in id, List<DateRange> ranges) {
this.id = id;
this.ranges = ranges;
}
public boolean isActive(Date date) {
for(DateRange dr : ranges) {
if(dr.contains(date)) {
return true;
}
}
return false;
}