java - 使用 java 流查找第一个免费的 "index"

标签 java java-8 java-stream

我需要在我的文件系统中找到第一个以名称流为源的空闲索引。

考虑列表:["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/

相关文章:

java对象引用在方法中被改变并理解结果

使用 java 8 时出现 java.lang.ClassCastException 但 java 7 一切正常

java - 流分组按子类型

java - 阻止使用库中的函数?

java - Camel reSTLet 在 POST 之后终止而不是返回主体

java-stream-List of Long to list in one line

java - 返回 Java 8 流的 Spring 存储库方法不会关闭 JDBC 连接

java - 使用java流比较两个字符串列表

java - Vaadin 动画师淡入刷新后消失

java - JSON 库返回 Java8 选项?