0

私はいくつかの要素の歴史的な見方を発展させています。各要素には開始日と終了日があります。期間は重複してはならないため、各開始日は前の終了日以降である必要があります。終了日が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エントリを期待しています。

4

1 に答える 1

2

最小要素となるものを定義しています(を定義することによりcompareTo)。

そして、あなたはあなた自身がそれを述べています:

「どちらの結果も同等と見なされます」

したがって、APIが最小要素を参照する場合、順序集合の引数の後または等しい(ceil)要素を参照します。次に、注文したセットを印刷します。

[(1、3)、(3、5)、(5、7)、(7、9)、(9、11)、(11、13)、(13、15)]

したがって、ceilingは最初に等しい要素( 0を返すことを5, null意味します)を探し、見つかった場合はその要素を返します。compareTo等しい2つの要素があります(したがって、その後の要素を探す必要はありません)。

これは、ceilingメソッドのドキュメントが参照しているものであり、セット内の順序です(ある種の新しい比較を設定することによるものではありません)。

パブリックE天井(E e)

指定された要素以上のこのセット内の最小要素を返します

TreeSet#ceiling(E e)APIを参照してください

したがって、5, 7または7,9(どちらもに等しい5, null)を見つけて、最初に見つけたものを返します。これは7,9、実装に応じたものです。

TreeSetは、実際には舞台裏のツリー構造(doh)であり、そのツリー内で2つの等しいノードにヒットするノードは、実装の詳細と、場合によっては挿入の順序によって異なります。

あなたのcompareTo/equalsは、通常の/推奨されるルールに従わない(ツリーがそれらを使おうとするのは確かに悪い)。AとBが等しく、CとBが等しい場合、AとCは等しくなければなりません。これは、compareTo関数には当てはまりません。

于 2012-05-23T20:06:29.613 に答える