Java 一旦范围已经存在,如何显示错误?

Java 一旦范围已经存在,如何显示错误?,java,Java,我有下面的代码 HashMap<BigDecimal, BigDecimal> allData = new HashMap<>(); allData.put(new BigDecimal(1.00),new BigDecimal(100.00)); allData.put(new BigDecimal(101.00),new BigDecimal(200.00)); allData.put(new BigDecimal(201.00),ne

我有下面的代码

    HashMap<BigDecimal, BigDecimal> allData = new HashMap<>();
    allData.put(new BigDecimal(1.00),new BigDecimal(100.00));
    allData.put(new BigDecimal(101.00),new BigDecimal(200.00));
    allData.put(new BigDecimal(201.00),new BigDecimal(300.00));
    allData.put(new BigDecimal(111.00),new BigDecimal(150.00));
    allData.put(new BigDecimal(301.00),new BigDecimal(400.00));
    allData.put(new BigDecimal(401.00),new BigDecimal(500.00));
    allData.put(new BigDecimal(210.00),new BigDecimal(220.00));
    allData.put(new BigDecimal(501.00),new BigDecimal(600.00));
若用户输入所有数据,则上述两个数据将无效,因为该范围已存在


如何检查?

如果地图不是太大,您可以使用以下命令在整个地图中扫描现有范围

allData().entrySet().stream().anyMatch(e -> e.getKey().compareTo(lower) <= 0 && e.getValue().compareTo(upper) >= 0)`
allData().entrySet().stream().anyMatch(e->e.getKey().compareTo(下)=0)`

其中
lower
upper
是要添加的范围的边界。

使用
HashMap
存储用例的范围似乎不是理想的方法

在您的实现中,如果新范围与现有范围具有相同的下限,它将覆盖现有条目

下面示例的输出

HashMap allData=newhashmap();
allData.put(新的BigDecimal(1.00),新的BigDecimal(100.00));
allData.put(新的BigDecimal(1.00),新的BigDecimal(200.00));
System.out.println(所有数据);
{1=200}

如您所见,第二个
put
覆盖第一个条目

如果您想继续使用
HashMap
实现,您可以在执行
put
之前检查新条目是否与现有条目重叠:

HashMap allData=newhashmap();
allData.put(新的BigDecimal(1.00),新的BigDecimal(100.00));
allData.put(新的BigDecimal(101.00),新的BigDecimal(200.00));
BigDecimal lowerBound=新的BigDecimal(111.00);
BigDecimal上限=新的BigDecimal(150.00);
//检查下限或上限是否在任何现有条目之间
布尔isOverlapping=allData.entrySet().stream()
.anyMatch(e->(e.getKey().compareTo(lowerBound)=0)
||e.getKey().compareTo(上限)=0);
if(等重叠){
System.out.println(“重叠”);
}否则{
allData.put(下限、上限);
}

使用自定义类的替代方法

最好为您的范围使用自定义类,该类实现了一个方法,该方法检查一个范围是否与另一个范围重叠。它可能是这样的:

公共类范围{
私有双十进制lowerBound;
私有大十进制上限;
公共范围(BigDecimal下限,BigDecimal上限){
this.lowerBound=lowerBound;
this.upperBound=上限;
}
公共BigDecimal getLowerBound(){
返回下边界;
}
公共BigDecimal getUpperBound(){
返回上限;
}
公共布尔重叠开关(范围其他){
return(lowerBound.compareTo(other.lowerBound)>=0&&upperBound.compareTo(other.lowerBound)=0&&upperBound.compareTo(other.upperBound)range.overlapsWith(anotherRange));
if(等重叠){
System.out.println(“已存在”);
}否则{
添加所有数据(另一个范围);
系统输出打印项次(“添加”);
}

Hi@David我需要检查介于两者之间的范围。这不是一个范围。这是一个键->值散列映射。我想你可以使用它来实现这个目的,但这是非常违反直觉的,因为你需要知道最小值来找到最大值。使用这种非正统方法想到的一个解决方案是在映射中获取键列表对它们进行评级,使用每个键找到相应的值,然后检查用户输入的键和值在每次迭代中是否位于最小值和最大值之间。你的意思是新条目是否与任何现有条目重叠,还是仅当它是完全相同的范围?在这个解决方案中,仅当任何现有范围完全包括新范围将提供
true
。不考虑仅包含下限或上限的情况。正确,这只检查包含,而不检查非空交叉点。从OP来看,我不清楚是否还应检查非空交叉点。因此我决定保持简短。调整lambda应该很容易,我希望。我能定义最大值的下限和上限吗?因为我们不能定义。我们需要从用户提供的数据中获取。
allData().entrySet().stream().anyMatch(e -> e.getKey().compareTo(lower) <= 0 && e.getValue().compareTo(upper) >= 0)`