我正在开发一些元素的历史视图。每个元素都有一个开始和结束日期。期间可能不重叠,因此每个开始日期必须等于或晚于其前任的结束日期。如果结束日期为空,则元素从其开始日期一直处于活动状态,直到已知结束日期为止。
出于测试目的,我创建了这个类:
public class Entry implements Comparable<Entry>
{
Integer start;
Integer end;
public Entry(Integer s, Integer e)
{
start = s;
end = e;
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof Entry)
{
return compareTo((Entry) obj) == 0;
}
return false;
}
@Override
public int compareTo(Entry o)
{
if (o.end != null // other ends before or when this starts
&& (o.end.equals(start) || o.end < start ))
{
return 1;
}
if (end != null // other starts after or when this ends
&& (o.start.equals(end) || o.start > end ))
{
return -1;
}
return 0;
}
}
我使用 TreeSet 对元素进行排序。现在我遇到的问题是我无法获得当前活动或第一个到来的元素。
查看 JavaDoc 天花板方法应该可以解决问题:
返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回 null。
但是,这不起作用。
在一个测试用例中,我创建了一个带有一堆条目的 TreeSet:
TreeSet<Entry> ts = new TreeSet<Entry>();
ts.add(new Entry(1, 3));
ts.add(new Entry(3, 5));
ts.add(new Entry(5, 7));
ts.add(new Entry(7, 9));
ts.add(new Entry(9, 11));
ts.add(new Entry(11, 13));
ts.add(new Entry(13, 15));
然后我使用以下代码获得天花板:
ts.ceiling(new Entry(5, null));
我期望的结果是开始 5 和结束 7 的条目(“相等”条目)。然而,结果是开始 7 和结束 9 的条目(更大的条目)。两个结果都等于或大于给定元素。但由于 JavaDoc 提到它返回最少的元素,我希望 5-7 条目。