gpt4 book ai didi

java - 生成可能的 boolean 组合的最优雅的方式

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:30 24 4
gpt4 key购买 nike

在给定您想要的最大 boolean 值数量的情况下,生成可能的 boolean 值组合的最优雅方法是什么?

例如:

bool(1) -> [false], [true]
bool(2) -> [false, false], [false, true], [true, false], [true, true]
...

这是我当前的实现:

public static List<Boolean[]> bool(int n) {
return IntStream.range(0, (int) Math.pow(2, n))
.mapToObj(i -> StringUtils.leftPad(Integer.toBinaryString(i), n, '0').chars().mapToObj(c -> c != '0').toArray(Boolean[]::new))
.collect(Collectors.toList());
}

但是我对我使用整数这一事实并不满意,然后使用 StringUtils.leftPad 和返回 Boolean[ 的 map 映射到二进制文件[ ] 而不是 boolean[]

有没有更好的方法可以使用 Stream API 在单行代码中完成此操作?

最佳答案

试试这个:

boolean[] bitSetToArray(BitSet bs, int width) {
boolean[] result = new boolean[width]; // all false
bs.stream().forEach(i -> result[i] = true);
return result;
}

List<boolean[]> bool(int n) {
return IntStream.range(0, (int)Math.pow(2, n))
.mapToObj(i -> bitSetToArray(BitSet.valueOf(new long[] { i }), n))
.collect(toList());
}

关键是BitSet有一个 stream()它的方法返回一个位的索引流。这可用于设置 true值变成 boolean[] .另请注意(如 Bubletan)可能有一个 List<boolean[]>而不是 List<Boolean[]> .即,原始数组列表 boolean值而不是盒装数组列表 Boolean值。 (这是因为数组是引用类型,因此可以用作类型参数。)

最后感谢Bubletan ,我通过添加 bitSetToArray() 来扩充其解决方案.

更新

srborlongan 在评论中询问以下是否可能更好:

List<boolean[]> bool(int n) {
return IntStream.range(0, (int)Math.pow(2, n))
.mapToObj(i -> new long[] { i })
.map(BitSet::valueOf)
.map(bs -> bitSetToArray(bs, n))
.collect(toList());
}

它确实具有密度较低的优点。毕竟,这不是代码高尔夫、APL 或 Perl,其目标似乎是尽可能以最简洁的方式编写一些东西。密度较低的代码通常(但并非总是)更易于阅读和理解。

不过,我认为在这种情况下存在一些细微差别。 mapToObj 发出的“obj”舞台是long[] ,推断为BitSet::valueOf的参数类型.这反过来会影响过载分辨率!除非您已经非常熟悉 BitSet API,你必须自己做一些类型推断才能弄清楚它在做什么。所以在这种情况下,直接调用 BitSet.valueOf(long[]) 可能会更好。 .

就性能而言——这并不总是最重要的——我认为直接方法调用可能比一系列 map 执行得更好操作。通过额外的流操作传递一个值可能涉及两个方法调用,加上 Lambda Metafactory 调用额外的 lambda 的开销。此外,与通过流传递值相比,直接方法调用可能更容易被 JIT 优化和内联。但我还没有验证任何这些。

关于java - 生成可能的 boolean 组合的最优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27994021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com