在我的程序中我有不同的场景
在开头设置将为空,如下所示:
[]
用户可以动态添加集合中的值让用户输入开始和结束整数为2和6,设置将如下:
[2,3,4,5,6]
A)用户可以做什么:
用户可以这样做之后让用户输入1和2,设置将如下:
[1,2,3,4,5,6]
用户也可以这样做,让用户输入6和8,设置如下:
[1,2,3,4,5,6,7,8]
B)用户不能做的是:
假设用户输入2和6,因为2,3,4,5,6
已经存在于集合中,因此程序应该向用户输出错误消息。
用户也做不到,假设用户输入0和10为0, 1,2,3,4,5,6,7,8 ,9,10粗体整数已经出现在设置,所以程序应该向用户输出错误信息。
C)最终结果:
最后一组应该像这个[1,2,3,4,5,6,7,8]
更新
用户也可以这样做,比如在开头设置为空是这样的:
[]
用户输入1和3,设置将如下:
[1,2,3]
用户输入5和7后,设置将如下:
[1,2,3,5,6,7]
用户输入3和5后,设置将如下
[1,2,3,4,5,6,7]
如何实现这一目标,我们将非常感谢任何帮助。
到目前为止我尝试过的是不行的:
Scanner reader = new Scanner(System.in);
System.out.println("Enter a start: ");
int s = reader.nextInt();
System.out.println("Enter a end: ");
int e = reader.nextInt();
Set<Double> filterSet = new TreeSet<>();
for (int i = s; i <= n; i++) {
if(filterSet.stream().allMatch(x -> x>=s && x<=e)){
System.out.println("Error");
}
else{
filterSet.add(i);
}
}
答案 0 :(得分:3)
您的流表达式无效的原因是您对范围的定义不一致。这种不一致会产生许多边缘情况,在决定结果是否有效时必须进行测试。一些例子(来自您的更新):
从空集Ø
开始,将其与[1,3]
联合起来(请注意,这是一个来自数学的封闭集合),给出结果{1,2,3}
< / p>
使用[5,7]
(另一个封闭集)结合之前的结果,从而产生{1,2,3,5,6,7}
与(3,5)
(注意到这是一个开放集)的结果导致{1,2,3,4,5,6,7}
如果我们在此处停止,您可以创建一个连贯的规则,如果结果的cardinality大于原始集|currentValue| > |previousValue|
的基数,则认为计算成功。但是,您在原始帖子中提供了一个示例,其中您计算了[0,10]
与[1,8]
的并集,其中此规则失败(即,值{0,9,10}已添加到集合中)。尽管结果的基数11大于前一个值8的基数,但计算被认为是失败。
你甚至可以慷慨,并认为所有新输入都是开放式集合,[1,8] ∪ (0,10) ⇔ [1,8] ∪ [1,9]
(注意从开放集到闭集集的变化),但这仍然会导致一个变化你没想到(9
被添加到集合中),因此需要测试边缘情况。
存在类似的情况,您从集[2,6]
开始(即{2,3,4,5,6}
)并将其与[1,2)
联合(注意部分打开的集)这会导致[1,6]
(即{1,2,3,4,5,6}
),即使它导致像前一个示例一样的单个更改,也会被视为成功。在这种情况下,元素1
将添加到集合而不是元素9
。
在一种情况下,我在序列的末尾添加了一个元素,而在另一种情况下,我在序列的开头添加了元素。为什么要区别对待这些?
在您提供一致的方法来确定结果是否有效之前,您不应期望对问题进行高质量的回答。
请参阅:notation
答案 1 :(得分:0)
我使用 Google Guava的RangeSet界面实现了我的目标。感谢@shmosel向我指出了这一点。
Scanner reader = new Scanner(System.in);
System.out.println("Enter a start: ");
int s = reader.nextInt();
System.out.println("Enter a end: ");
int e = reader.nextInt();
RangeSet<Integer> rangeSet= TreeRangeSet.create();
if(rangeSet.isEmpty()){
System.out.println("1 Empty");
rangeSet.add(Range.closed(s, e));
}else {
System.out.println("1 Not Empty");
if(!rangeSet.encloses(Range.closed(s, e)) && !rangeSet.intersects(Range.open(s, e))){
System.out.println("2 Yes");
rangeSet.add(Range.closed(s, e));
}else{
System.out.println("2 No");
}
}
System.out.println("Range: " + rangeSet)