1

我需要将一些数据组织成日期范围。我有一系列标识符,每个标识符都有一些有效的日期范围。日期范围由开始日期和结束日期组成,我将其保存在包含两个日期元素的列表中。所以最后,我有一个Map<Integer, List<List<Date>>>,看起来有点麻烦。有没有更好的方法来保存这些信息?

4

4 回答 4

1

你可以试试番石榴MultiMap

ListMultimap<Integer, List<Date>> mm  = LinkedListMultimap.create();
于 2013-06-26T10:48:50.190 回答
0

如果您对包括 guava 或 apache 不感兴趣,这里有一个解决方案。

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>>看起来很容易阅读。为了进一步分解它,您可以创建一个 Identifier 类,如Rene Links 的回答所建议的那样,只需将 apache commons Range 替换为您DateRange的 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;
    }
于 2013-06-26T11:06:03.453 回答
0

一般来说,你可以把它分成几类:

class A {
  Date from;
  Date until;
}

class B {
  List<A> list = ...
}

class C {
  List<B> list = ...
}

当然是有意义的名字。所以你可以C在你的地图中使用。

无论如何,您可能会在每个类级别上都有方法,因此稍后您不必担心这些方法的位置——它们也很适合这个结构。

于 2013-06-26T10:48:04.337 回答
0

我建议使用以下内容,看起来更好(主观)并且在域方面更正确:

Map<Integer, List<DateRange>>

哪里DateRange可能只是:

public class DateRange {
  Date start;
  Date end;
}

(修改限定符并添加您认为合适的 getter/setter/methods)

额外提示:另外,我想指出,对于大多数现实世界的约会任务,java.util.Datejava.util.Calendar很难使用并且并不总是明确定义的。我建议你考虑使用Joda time恰好有一个Interval适合您的场景的类。

于 2013-06-26T11:34:42.460 回答