我正在寻找一种执行以下操作的聪明方法:

列出数字:

1、2、3、4、5、12、13、14、19

然后将其压缩为一个字符串,如下所示:

1-5、12-14、19

使用以下规则:仅当范围内的数字计数为3或更大时,才压缩到范围内(即使用破折号)。

即:1、2、4、5将导致:1、2、4、5,而不是:1-2、4-5

最佳答案

我只能考虑一个自定义的收集器...显然,可以创建一个返回该收集器的方法,并且在这种情况下,如果该收集器是通过静态工厂方法隐藏的,则该代码将非常紧凑。

注意combiner基本上什么都不做,对于并行编码不好。我仍在尝试为它提供实现的好方法。

 List<String> result = IntStream.of(1, 2, 3, 4, 5, 12, 13, 14, 19)
            .boxed()
            .collect(Collector.of(
                    () -> {
                        List<List<Integer>> list = new ArrayList<>();
                        list.add(new ArrayList<>());
                        return list;
                    },
                    (list, x) -> {
                        List<Integer> inner = list.get(list.size() - 1);
                        if (inner.size() == 0) {
                            inner.add(x);
                        } else {
                            int lastElement = inner.get(inner.size() - 1);
                            if (lastElement == x - 1) {
                                inner.add(x);
                            } else {
                                List<Integer> oneMore = new ArrayList<>();
                                oneMore.add(x);
                                list.add(oneMore);
                            }
                        }
                    },
                    (left, right) -> {
                        throw new IllegalArgumentException("No parallel!");
                    },

                    list -> {

                        return list.stream()
                                .map(inner -> {
                                    if (inner.size() > 1) {
                                        return inner.get(0) + "-" + inner.get(inner.size() - 1);
                                    }
                                    return "" + inner.get(0);
                                }).collect(Collectors.toList());

                    }));

    System.out.println(result);

关于java - 将逗号分隔的数字列表压缩到范围内,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45321012/

10-11 08:11