【问题标题】:Checking divisor checking in Array using streams使用流检查除数检查数组
【发布时间】:2021-05-24 14:31:10
【问题描述】:

我想知道是否可以执行下面的嵌套 for 循环,检查列表中的每个元素以及它的除数不等于 1 从同一列表中的计数,作为流。如果是这样,是否会推荐它而不是传统的 for 循环?

示例输入 - “列表键”转换为“数组 - arr”。

int max = Integer.MIN_VALUE;
for(int i = 0; i < keys.size(); i++){
    int count = 0;
    for(int k = 0; k < keys.size(); k++){
        if(arr[i] % arr[k] == 0 && arr[k] != 1){
            count++;
        }
    }
    max = Math.max(max,count);
}

【问题讨论】:

  • 示例输入(keysarr)和预期输出会有很大帮助。我无法想象背后的逻辑。
  • “比传统的 for 循环更推荐”:根据哪个方面?可读性、性能、代码复杂性、美学美感、可测试性、易于调试?
  • 抱歉 Nikolas,我已经添加了示例输入。
  • 在性能方面,这会是首选吗? - 拉尔夫·克莱伯霍夫
  • keys.size() 是否等于 arr.length

标签: java for-loop java-8 java-stream


【解决方案1】:

您可以使用streams 来做到这一点,如下所示,但正如@Ralf Kleberhoff 提到的streams 相对于传统for-loop 的优势取决于各种因素,可读性方面它很简洁,但对于调试或日志记录,我认为是传统的for-loop 更好

int max = keys.stream()
          .map(i -> IntStream.range(0, keys.size()).filter(k -> arr[i] % arr[k] == 0 && arr[k] != 1).count())
          .max((o1, o2) -> Math.toIntExact(o1 - o2))
          .map(Math::toIntExact).orElse(Integer.MIN_VALUE);

【讨论】:

  • 谢谢拉詹。
  • 由于 rajan 提到循环版本更具可读性,您可以通过从 k 中提取方法来改进 -> arr[i] % arr[k] == 0 && arr[k] != 1 )
【解决方案2】:

keys列表和数组arr之间的关系不是很清楚。

在原始代码中,循环基于keys 列表大小的迭代(keys 的内容被忽略)。

另外,可能需要在分母中排除0,当一个数字被自身除时。

带有索引的for-loops可以替换为IntStream.range(0, keys.size())

int[] divisors = IntStream.range(0, arr.length)
        .map(i -> (int) IntStream.range(0, arr.length)
                .filter(k -> arr[i] != arr[k] && arr[k] != 0 && arr[k] != 1 && arr[i] % arr[k] == 0)
                .count()
        )
        .toArray();

相反,Arrays.stream 可用于arr 数组并忽略foreach 循环中的索引。

int[] divisors = Arrays.stream(arr)
        .map(x -> (int) Arrays.stream(arr)
                .filter(y -> x != y && y != 0 && y != 1 && x % y == 0)
                .count()
        )
        .toArray();

int max = Arrays.stream(divisors).max().getAsInt();

System.out.println(Arrays.toString(divisors));
System.out.println(max);

对于测试数组int[] arr = {6, 0, 1, 6, 2, 4, 8};,输出如下:

[1, 5, 0, 1, 0, 1, 2]
5

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多