私はいくつかの要素の歴史的な見方を発展させています。各要素には開始日と終了日があります。期間は重複してはならないため、各開始日は前の終了日以降である必要があります。終了日がnullの場合、要素は開始日から終了日がわかるまでアクティブです。
テストの目的で、私はこのクラスを作成しました:
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を見ると、ceilingメソッドでうまくいくはずです。
指定された要素以上のこのセット内の最小要素を返します。そのような要素がない場合は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エントリを期待しています。