假设我有一个 list
ArrayList<String> arr = new ArrayList(Arrays.asList("N1", "N2", "N3", "N5"));
我如何找到“N4”,我如何找到缺失的整数4?
到目前为止我尝试过的
Integer missingID = arr.stream().map(p -> Integer.parseInt(p.substring(1))).sorted()
.reduce((p1, p2) -> (p2 - p1) > 1 ? p1 + 1 : 0).get();
这是行不通的,因为在这种情况下
reduce
并非按我需要的方式工作,实际上,我不知道该怎么做。如果没有缺失的数字,那么下一个必须是
"N6" - or just 6 -
(在此示例中)它必须使用Java标准流的库完成,不能使用第三方。
最佳答案
这项工作比您预期的要多,但是可以通过collect
调用来完成。
public class Main {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>(Arrays.asList("N1", "N2", "N3", "N5", "N7", "N14"));
Stream<Integer> st = arr.stream().map(p -> Integer.parseInt(p.substring(1))).sorted();
Holder<Integer> holder = st.collect(() -> new Holder<Integer>(),
(h, i) -> {
Integer last = h.getProcessed().isEmpty() ? null : h.getProcessed().get(h.getProcessed().size() - 1);
if (last != null) {
while (i - last > 1) {
h.getMissing().add(++last);
}
}
h.getProcessed().add(i);
},
(h, h2) -> {});
holder.getMissing().forEach(System.out::println);
}
private static class Holder<T> {
private ArrayList<T> processed;
private ArrayList<T> missing;
public Holder() {
this.processed = new ArrayList<>();
this.missing = new ArrayList<>();
}
public ArrayList<T> getProcessed() {
return this.processed;
}
public ArrayList<T> getMissing() {
return this.missing;
}
}
}
此打印
4
6
8
9
10
11
12
13
请注意,这种事情并不是真的特别适合
Stream
。所有流处理方法都倾向于一次将每个项目传递给您,因此您需要一次处理所有遗漏的数字,最后,您将编写大量代码以避免只写一个循环。