假设我有一个 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。所有流处理方法都倾向于一次将每个项目传递给您,因此您需要一次处理所有遗漏的数字,最后,您将编写大量代码以避免只写一个循环。

07-27 21:17