java - 创建自定义交替数字流

标签 java java-8 java-stream

我如何制作一个从给定连续范围的中间开始的 IntStream,然后从中间开始并向左和向右交替流式传输下一个数字。例如,对于给定的连续数字范围 1 2 3 4 5,自定义序列将为 3 2 4 1 53 4 2 5 1 取决于您是先从左还是从右开始。

我基本上是在尝试从中间开始遍历一个数组,然后均匀地向外(而不是先完全向左或向右)。

我试过只使用 for 循环,但是代码很乱,我认为只排列一个集合或数字流会更好很多,而不是即时检查它(因为必须检查所有索引越界异常)。这是我认为作为预计算的整数流会更好的原始代码:

        int middle = myArray.length / 2;
        Object value = myArray[middle]; //have to reference middle since the for loop won't
        //do operation on value
        for (int offset = 1; true; offset++) {
            int nextRight = middle + offset;
            int nextLeft = middle - offset;
            if (nextRight < myArray.length) { // Have to guard against exception, but can't catch exception ahead of time because left or null may not be empty.
                Object value = myArray[nextRight];
                //do operation on value
            }
            if (nextLeft >= 0) {
                Object value = myArray[nextRight];
                //do operation on value
            }
            if (nextRight >= myArray.length) {
                break; //exit logic
            }
            if (nextLeft < 0) {
                break; //exit logic
            }
        }

最佳答案

试试这个:

import static java.lang.Integer.signum;

static IntStream altSeq(int n) {
    return IntStream.iterate(2 * (n % 2) - 1, i -> -i - signum(i))
                    .map(i -> i / 2 + (n + 1) / 2)
                    .limit(n);
}

例如,altSeq(5) 产生:

[3, 2, 4, 1, 5]

并运行 altSeq(6) 产生:

[3, 4, 2, 5, 1, 6]

简单地说,我们生成一个交替符号的升序:

1, -2, 3, -4, 5, ...

这就是 i -> -i - signum(i) 表达式的作用。然后,我们除以二以获得与中点的偏移量:

0, -1, 1, -2, 2, ...

这就是 map 表达式第一项中的 i/2 的来源。然后我们添加范围 1..n 的中点,即 (n + 1)/2map 表达式的第二项。对于 n = 5,这给了我们

3, 2, 4, 1, 5, ...

从 1 开始适用于奇数长度序列。对于偶数长度,我们希望从 -1 开始。种子表达式 2 * (n % 2) - 1 计算偶数和奇数长度序列的正确种子值。

最后,我们应用 limit(n) 来终止序列。

关于java - 创建自定义交替数字流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48035481/

相关文章:

java - 多态性和预验证类属性

java - 为什么我的 jar 文件拒绝分发?

java - JDBC 表创建捕获没有按照我的预期出错

java - OSGI包可见服务实现

java - 用 Switch 打击,降低圈复杂度 java

java - 如何在 Eclipse 中的类型上启用 JSR308 空注释?

java-8 - 如何使用Java 8 Collectors groupingBy来获取带有集合Map的Map?

java - 如何根据 2 个值从 map 中过滤文档并创建另一个 map

java - 我应该使用 Java 8 Streams Api 来组合两个集合吗?

java - 从重复逻辑基于自定义字段的列表中删除重复项