我需要在我的文件系统中找到第一个以名称流为源的空闲索引。
考虑列表:["New2", "New4", "New0", "New1", ...] 第一个未使用的索引将是 3。
int index = 0;
try (IntStream indexes = names.stream()
.filter(name -> name.startsWith("New"))
.mapToInt(Integer::parseInt)
.distinct()
.sorted())
{
// I was thinking about making possible indexes stream, removing existig ones from try-with-resource block, and getting .min().
IntStream.rangeClosed(0, 10)... // Idk what to do.
}
我要求某人帮我找到适合我的想法的语法或提出更好的解决方案。
最佳答案
最有效的方法是收集到一个BitSet
中:
int first = names.stream()
.filter(name -> name.startsWith("New"))
.mapToInt(s -> Integer.parseInt(s.substring(3)))
.collect(BitSet::new, BitSet::set, BitSet::or).nextClearBit(0);
请注意,这些位本质上是有序且不同的。此外,总会有一个“免费”索引。如果0
和最大数之间没有间隙,那么下一个free就是maximum+1,如果根本没有匹配的元素,那么下一个free就是0。
从 Java 9 开始,我们可以做得更高效
int first = names.stream()
.filter(name -> name.startsWith("New"))
.mapToInt(s -> Integer.parseInt(s, 3, s.length(), 10))
.collect(BitSet::new, BitSet::set, BitSet::or).nextClearBit(0);
直接解析字符串的相关部分,省去substring
操作。
关于java - 使用 java 流查找第一个免费的 "index",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41252079/