decimal型BigDecimalの重複をチェックする方法
BigDecimal同士の大小比較にはcompareToメソッドが利用できます。
2つのBigDecimalオブジェクトaとbが重なるかどうか(つまり、交差部分が存在するかどうか)については、次の手順で判断できます。
- aの最小値とbの最大値の大小をcompareToメソッドで比較する:
- aの最小値がbの最大値より小さい場合、aの区間はbの区間よりも左端で、共通部分はない。
- aの最小値がbの最大値と等しい場合、aの区間とbの区間が隣接しており、交差の可能性があることを示唆します。
- aの最小値がbの最大値を越えている場合、aの範囲はbの範囲の右側に位置し、交点は存在しない。
- aの最大値とbの最小値の大小関係をcompareToメソッドで比較
- aの最大値がbの最小値よりも小さい場合は、aの区間はbの区間の左側にあり、交差はありません。
- aの最大値がbの最小値のとき、aとbの区間が隣接しており、重複区間の可能性がある
- aの最大値がbの最小値より大きい場合は、aの区間はbの区間の右側になり、交わらないことを意味します。
- 上記2件の比較結果を元に、隣接または重複がある場合はその2つの区間は重複とみなし、そうでない場合は重複とはみなさない。
サンプルコードを以下に示します
import java.math.BigDecimal;
public class BigDecimalInterval {
public static void main(String[] args) {
BigDecimal aMin = new BigDecimal("1.5");
BigDecimal aMax = new BigDecimal("3.5");
BigDecimal bMin = new BigDecimal("2.0");
BigDecimal bMax = new BigDecimal("4.0");
if (aMin.compareTo(bMax) > 0 || aMax.compareTo(bMin) < 0) {
System.out.println("两个区间不重复");
} else {
System.out.println("两个区间重复");
}
}
}
上記の例では、a は [1.5, 3.5]、b は [2.0, 4.0] の範囲にあり、比較の結果、2 つの範囲に共通点があることがわかります。そのため、結果は「2 つの範囲が重複」となります。