当前位置: 首页 > 知识库问答 >
问题:

在Java8中显示分块项目列表

赵英哲
2023-03-14

使用以下代码:

public class Main {

    public static void main(String[] args) {
        final List<Integer> items = 
             IntStream.rangeClosed(0, 23).boxed().collect(Collectors.toList());

        final String s = items
            .stream()
            .map(Object::toString)
            .collect(Collectors.joining(","))
            .toString()
            .concat(".");

        System.out.println(s);
    }
}

我得到:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23。

我想做的是每 10 个项目中断一次行,以便获得:

0,1,2,3,4,5,6,7,8,9,

10,11,12,13,14,15,16,17,18,19,

20,21,22,23.

我在谷歌搜索后尝试了很多事情,但都没有成功!你能帮助我吗?

谢谢

奥利维尔。

共有3个答案

贾俊喆
2023-03-14

以下是对注释Publector中已链接的内容的改编:

    private static Collector<String, ?, String> partitioning(int size) {
    class Acc {
        int count = 0;

        List<List<String>> list = new ArrayList<>();

        void add(String elem) {
            int index = count++ / size;
            if (index == list.size()) {
                list.add(new ArrayList<>());
            }
            list.get(index).add(elem);
        }

        Acc merge(Acc right) {

            List<String> lastLeftList = list.get(list.size() - 1);
            List<String> firstRightList = right.list.get(0);
            int lastLeftSize = lastLeftList.size();
            int firstRightSize = firstRightList.size();

            // they are both size, simply addAll will work
            if (lastLeftSize + firstRightSize == 2 * size) {
                System.out.println("Perfect!");
                list.addAll(right.list);
                return this;
            }

            // last and first from each chunk are merged "perfectly"
            if (lastLeftSize + firstRightSize == size) {
                System.out.println("Almost perfect");
                int x = 0;
                while (x < firstRightSize) {
                    lastLeftList.add(firstRightList.remove(x));
                    --firstRightSize;
                }
                right.list.remove(0);
                list.addAll(right.list);
                return this;
            }

            right.list.stream().flatMap(List::stream).forEach(this::add);
            return this;
        }

        public String finisher() {
            return list.stream().map(x -> x.stream().collect(Collectors.joining(",")))
                    .collect(Collectors.collectingAndThen(Collectors.joining(",\n"), x -> x + "."));
        }

    }
    return Collector.of(Acc::new, Acc::add, Acc::merge, Acc::finisher);
}

用法将是:

String result = IntStream.rangeClosed(0, 24)
            .mapToObj(String::valueOf)
            .collect(partitioning(10));
燕刚捷
2023-03-14

如果你想做的只是处理这些升序数字,你可以这样做

String s = IntStream.rangeClosed(0, 23).boxed()
    .collect(Collectors.groupingBy(i -> i/10, LinkedHashMap::new,
            Collectors.mapping(Object::toString, Collectors.joining(","))))
    .values().stream()
    .collect(Collectors.joining(",\n", "", "."));

该解决方案也可以适应于任意随机访问列表,例如

List<Integer> items = IntStream.rangeClosed(0, 23).boxed().collect(Collectors.toList());

String s = IntStream.range(0, items.size()).boxed()
    .collect(Collectors.groupingBy(i -> i/10, LinkedHashMap::new,
            Collectors.mapping(ix -> items.get(ix).toString(), Collectors.joining(","))))
    .values().stream()
    .collect(Collectors.joining(",\n", "", "."));

然而,对于任意流没有简单而优雅的解决方案,这一限制适用于依赖于元素位置的所有类型的任务。

南宫博简
2023-03-14

如果您愿意使用第三方库,则可以使用 Eclipse Collections Collectors2.chunk(int) 执行以下操作。

String s = IntStream.rangeClosed(0, 23)
        .boxed()
        .collect(Collectors2.chunk(10))
        .collectWith(MutableList::makeString, ",")
        .makeString("", ",\n", ".");

Collectors2.chunk(10) 的结果将是一个 MutableList

如果只使用Eclipse集合API,这个问题可以简化如下:

String s = Interval.zeroTo(23)
        .chunk(10)
        .collectWith(RichIterable::makeString, ",")
        .makeString("", ",\n", ".");

注意:我是Eclipse集合的提交者。

 类似资料:
  • 英文原文:http://emberjs.com/guides/templates/displaying-a-list-of-items/ 如果你需要枚举一个对象列表,可以使用Handlebar的{{#each}}助手: 1 2 3 4 5 <ul> {{#each people}} <li>Hello, {{name}}!</li> {{/each}} </ul> 对于数组中的

  • 这是我在尝试从数据库中检索所有主题时得到的错误。我错过了什么? Whitelabel错误页面此应用程序没有/Error的显式映射,因此您将其视为一种后退。 学科类

  • 问题内容: 我有一个Foo类,它仅加载FXML并创建场景。 在FXML中,我将控制器设置为FooController() 然后添加一个MenuButton: 我尝试在FooController中设置menuButton: 但是,尽管为MenuButton设置了所有内容,但它并未在GUI中显示任何CheckMenuItems。 如何在FXML中定义的menuButton中加载这些项目? 问题答案:

  • 这是我现在面临的一个奇怪的问题。从我的应用程序中,我从JSON文件中从链接中获取数据,然后用Volley解析它。现在我想在一个看起来不起作用的RecyclerView上显示数据,我很高兴我的代码很好,但是有些东西似乎不起作用,我找不到它。 这是活动代码 HomeActivity.java: 这是我从适配器中扩展的布局,并从JSON文件中设置数据 和适配器类相关的代码,我猜: @Override p

  • 您可以使用#each帮助程序显示数组中的项列表,并为数组中的每个项迭代一次。 语法 (Syntax) <ul> {{#each array_name as |block-param| }} <li>{{block-param}}</li> {{/each}} </ul> 在上面的代码中,模板迭代array_name ,其中包括对象和指定为block-param的数组中的每

  • 我在Ubuntu12.10上运行NetBeans7.3。我正在学习一门Java Web开发课程,所以我有一个名为jsage8的项目,其中包含了我为该课程所做的工作。以前,这个项目在Projects选项卡中显示得很好,但现在打开这个项目什么也做不到。当我在打开项目菜单中单击打开它时,它只是说“没有项目打开”。然而,它将打开一个不是基于web的项目的普通Java项目文件夹。目前项目中只有一个index