在我的程序中,我有不同的场景
开始时集合将为空,如下所示:
[]
用户可以动态地在集合中添加值,假设用户输入起始和结束整数为 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);
}
}
最佳答案
您的流表达式不起作用的原因是您对范围的定义不一致。这种不一致会产生许多边缘情况,您在决定结果是否有效时必须对其进行测试。一些示例(来自您的更新):
从一个空集 Ø
开始,将其与 [1,3]
并集(请注意,这是数学中的闭集 ) 给出结果 {1,2,3}
将之前的结果与 [5,7]
(另一个闭集)合并,得到 {1,2,3,5,6,7}
将结果与 (3,5)
合并(注意这是一个开集),得到 {1,2,3,4,5 ,6,7}
如果我们停在这里,您可以创建一个连贯的规则,其中如果 cardinality 则计算被视为成功。结果的基数大于原始集合的基数,|currentValue| > |前一个值|
。但是,您在原始帖子中提供了一个示例,其中计算了 [0,10]
与 [1,8]
的并集,其中此规则失败(即,值 { 0,9,10} 已添加到集合中)。即使结果的基数 11 大于前一个值的基数 8,计算也会被视为失败。
您甚至可以慷慨地将所有新输入视为开集,[1,8] ∪ (0,10) ⇔ [1,8] ∪ [1,9]
(< em>请注意从开放集到封闭集的更改),但这仍然会导致您没有预料到的一项更改(9
已添加到集合中),因此需要进行测试边缘情况。
存在类似的情况,您从集合 [2,6]
(即 {2,3,4,5,6}
)开始并将其合并与 [1,2)
(注意部分开集)会导致 [1,6]
(即 {1 ,2,3,4,5,6}
),即使它导致像前面的示例一样的单个更改,也被认为是成功的。在本例中,元素 1
被添加到集合中,而不是元素 9
。
在一种情况下,我将一个元素添加到序列的末尾,在另一种情况下,我将元素添加到序列的开头。为什么要区别对待这些?
在您提供一致的方法来确定结果是否有效之前,您不应期望得到高质量的问题答案。
参见:notation
关于Java:如何应用过滤器来设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46084907/