【问题标题】:How to test if it is a Fibonacci Stream?如何测试它是否是斐波那契流?
【发布时间】:2015-06-02 13:17:34
【问题描述】:

这不是斐波那契流。

LongStream digits = LongStream.of(0, 1, 2 , 3 , 4, 5, 6, 7, 8, 9);

这也不是。

LongStream naturals = LongStream.iterate(1,  (i) -> i + 1);

但是,您如何检查它们是否不是?

注意第二个流是无限的,所以你需要一些短路操作来尽快停止。不幸的是,短路方法 'allMatch' 和 'anyMatch' 只测试元素,而不是序列。

【问题讨论】:

  • 我看不出你如何测试无限流是斐波那契流。即使您按照斐波那契数列测试前 1,000,000 个元素,也无法保证第 1,000,001 个元素会遵循。
  • 如果提供了zip 方法,您可以使用boolean same = zip(fib.boxed(), naturals.boxed(), (a, b) -> a.equals(b)).allMatch(x -> x == true); 之类的方法(注意(a, b) -> a.equals(b) 可以简化为Objects::equals)。你可以检查这个线程:stackoverflow.com/questions/17640754/… 但是对于无限流,你可以limit 之前的流,但这并不是因为 n-1 个元素等于第 n 个元素......
  • 如果它是一个问题,忘记无限流。我说这只是为了强制对您的答案进行短路操作:P。事实上,我不介意斐波那契。我可以问下一个问题:“你如何测试一个流是有序的而不需要迭代它的所有元素?”
  • 这取决于。您可以尝试抓取 Stream 的 spliterator 并查看它是否具有 SORTED 特征。否则,恐怕唯一的方法就是遍历所有元素。对于任何序列,在您按照遇到的顺序比较所有元素之前,您无法知道它是否已排序。
  • @atalarico 鉴于您收到的关于无限流和确定顺序等的建议,您现在有什么问题?

标签: java-8 java-stream short-circuiting


【解决方案1】:

使用番石榴Iterables.elementsEqual:

Supplier<Integer> fibonacci = new Supplier<Integer>() {
        int first = 0;
        int second = 1;

        @Override
        public Integer get() {
            int result = first + second;
            first = second;
            second = result;
            return first;
        }
    };
boolean isMatch = Iterables.elementsEqual(
                     toTest, 
                     Stream.generate(fibonacci).limit(toTest.size()).collect(Collectors.toList()));

【讨论】:

  • 我想“toTest = () -> stream.iterator()”。干得好:)
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多