Java:如何应用过滤器来设置?

时间:2017-09-06 21:54:34

标签: java collections java-8 set treeset

在我的程序中我有不同的场景

在开头设置将为空,如下所示:

[]

用户可以动态添加集合中的值让用户输入开始和结束整数为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);
            }
}

2 个答案:

答案 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)