/**
   * 区間同士の比較を行う。
   *
   * <p>下限限界優先ロジック: 下限限界値がより小さい方を「小さい」と判断する。同一の場合は、上限限界値がより<strong>大きい</strong>方を「小さい」とする。
   * ただし、空区間は他のどんな区間よりも大きい。
   *
   * @param e1 比較対象1
   * @param e2 比較対象2
   * @return 同値であった場合は {@code 0}、この{@code e1}が比較対象よりも小さい場合は負数、大きい場合は正数
   * @throws NullPointerException 引数に{@code null}を与えた場合
   */
  @Override
  public int compare(Interval<T> e1, Interval<T> e2) {
    if (e1 == null || e2 == null) {
      throw new NullPointerException();
    }

    // 下限限界優先ロジック
    if (e1.isEmpty() && e2.isEmpty()) {
      return 0;
    } else if (e1.isEmpty()) {
      return 1;
    } else if (e2.isEmpty()) {
      return -1;
    }

    int upperComparance = e1.upperLimitObject.compareTo(e2.upperLimitObject);
    int lowerComparance = e1.lowerLimitObject.compareTo(e2.lowerLimitObject);
    return lowerComparance != 0 ? (lowerComparance + lowerFactor) : (upperComparance * upperFactor);
  }
 public IntervalSequence gaps() {
   IntervalSequence gaps = new IntervalSequence();
   if (intervals.size() < 2) return new IntervalSequence();
   for (int i = 1; i < intervals.size(); i++) {
     Interval left = (Interval) intervals.get(i - 1);
     Interval right = (Interval) intervals.get(i);
     Interval gap = left.gap(right);
     if (!gap.isEmpty()) gaps.add(gap);
   }
   return gaps;
 }