1

2 つの整数区間が重複しているかどうかをチェックするクラスを作成しました。しかし、私はこの解決策があまり好きではありません。より良い、よりシンプルな方法でそれを行うことは可能だと思います。

public class IntegerInterval implements Interval {
private Integer start;
private Integer end;

public IntegerInterval(Integer start, Integer end) {
    this.start = start;
    this.end = end;
}

public Integer getStart() {
    return start;
}

public Integer getEnd() {
    return end;
}

public boolean isOverlapping(IntegerInterval other) {
    if (other != null) {
        return isInInterval(start, other) || isInInterval(end, other)
                || isInInterval(other.start, this) || isInInterval(other.end, this);
    }
    return false;
}

public boolean isInInterval(Integer number, IntegerInterval interval) {
    if (number != null && interval != null) {
        if(interval.getStart() == null && interval.getEnd() != null) {
            return number.intValue() <= interval.getEnd().intValue();
        }
        if(interval.getStart() != null && interval.getEnd() == null) {
            return number.intValue() >= interval.getStart().intValue();
        }
        if(interval.getStart() == null && interval.getEnd() == null) {
            return true;
        }
        return interval.getStart() <= number && number <= interval.getEnd();
    }
    else if(number == null && interval != null) {
        return interval.getStart() == null && interval.getEnd() == null;
    }
    return false;
}

}

4

3 に答える 3

3

次のコードはより単純です。

public boolean isOverlapping(IntegerInterval other) {
    if (other == null) return false; // for readability's sake, this condition is pulled out

    // overlap happens ONLY when this's end is on the right of other's start
    // AND this's start is on the left of other's end.
    return (((this.end == null) || (other.start == null) || (this.end.intValue() >= other.start.intValue())) &&
        ((this.start == null) || (other.end == null) || (this.start.intValue() <= other.end.intValue())));
}

UPDATEDate @Adamが実際に尋ねたように比較すると、コードは次のようになります。

private static boolean dateRangesAreOverlaping(Date start1, Date end1,
                                               Date start2, Date end2) {
return (((end1 == null) || (start2 == null) || end1.after(start2)) &&
         ((start1 == null) || (end2 == null) || start1.before(end2)));

}

于 2013-01-08T08:46:53.633 に答える
2

をカプセル化できる特定のクラスにラップする必要がstartあります。この方法では、 inを呼び出すだけで済み、 を気にする必要はありません。endComparablenullcompareToisInIntervalnull

そのクラスは、正と負の無限大を明示的に表すこともできます。

編集:クラス宣言に
型パラメーターを追加し、 の型と型を宣言すると、 だけでなく、で実装する任意の型を使用できます。<T extends Comparable<T>>startendComparable<T>ComparableIntervalInteger

于 2013-01-08T08:41:34.830 に答える
1

仮定しstart < endます。startの相対的な位置を 3 つチェックする必要がありますother: 左、中央、右 (右は交差が不可能なため、完全を期すためのものです)。残りの 2 つのチェックは次のとおりです。

 (start <= other.start && end >= other.start) || 
 (start >= other.start && start <= other.end)  
 // start > other.end means no intersection as end > start > other.end

2 番目の chech よりも場所startを確認する場合は、次のようになります。if(start <= other.end)

 if (start <= other.start) return end >= other.start;
 else if (start <= other.end) return true;
 else return false;

必要に応じて「=」の部分を調整し、null適切にチェックを追加します (つまり、SpaceTrucker の回答を使用して、クラス内に隠されている null と比較します)。

于 2013-01-08T08:40:41.523 に答える