数据结构 - 是否有更好的替代Map <integer,list <list <date =“”>&gt;&gt;?</integer,>

时间:2013-06-26 10:39:16

标签: java data-structures

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

4 个答案:

答案 0 :(得分:1)

您可以尝试番石榴MultiMap

ListMultimap<Integer, List<Date>> mm  = LinkedListMultimap.create();

答案 1 :(得分:0)

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

class A {
  Date from;
  Date until;
}

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

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

当然有了有意义的名字。因此,您可以在地图中使用C

你可能会在每个类级别都有方法,所以稍后你不必担心这些方法的位置 - 它们也很适合这个结构。

答案 2 :(得分:0)

如果您对包含番石榴或阿帕奇不感兴趣,可以使用以下解决方案。

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's answer建议的标识符类,只需将apache commons Range替换为DateRange的列表,如下所示:

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;
    }

答案 3 :(得分:0)

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

Map<Integer, List<DateRange>>

DateRange可能只是:

public class DateRange {
  Date start;
  Date end;
}

(根据需要修改限定符并添加getter / setters /方法)

额外提示另外,我想指出,对于大多数实际日期任务,java.util.Datejava.util.Calendar很难使用,而不是总是很明确的。 我建议您考虑使用Joda time恰好有一个Interval类适用于您的场景。