【问题标题】:Get partition data from a list with defined position [duplicate]从具有定义位置的列表中获取分区数据[重复]
【发布时间】:2021-07-15 11:19:50
【问题描述】:

我使用下面的程序从定义的列表中找出所有子列表。请在下面找到程序

public static void sublist() {
        int position = 2;

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

        arrlist.add("A");
        arrlist.add("B");
        arrlist.add("C");
        arrlist.add("D");
        arrlist.add("E");

        System.out.println("Original arrlist: " + arrlist);

        for (int i = 0; i < arrlist.size(); i += position) {
            int k = arrlist.size() > i + position ? i + position : arrlist.size();

            List<String> arrlist2 = arrlist.subList(i, k);
            System.out.println("Sublist of arrlist: " + arrlist2);
        }
    }

输出::

Original arrlist: [A, B, C, D, E]
Sublist of arrlist: [A, B]
Sublist of arrlist: [C, D]
Sublist of arrlist: [E]

以上程序运行良好。

我的问题是,还有其他使用 java 8 的简单方法吗?

【问题讨论】:

标签: java


【解决方案1】:

如果你想使用 Java 8 Streams,你可以像这样使用“IntStream”:

List<List<String>> arrlist2 =
    IntStream.range(0, arrlist.size())
        .filter(i -> i % position == 0)
        .mapToObj(i -> arrlist.subList(i, Math.min((i + position), arrlist.size())))
        .collect(Collectors.toList());

带有System.out.println(arrlist2); 的列表的输出将如下所示:

[[A, B], [C, D], [E]]

重要的是如果最后一个分区小于其他分区的大小时的特殊情况处理。

否则你也可以使用 Java Guava 中的Lists.partition(参见https://www.geeksforgeeks.org/java-guava-lists-partition-method-with-examples/


从 Java 9 开始,您还可以像这样使用IntStream.iterate

List<List<String>> arrlist3 =
    IntStream.iterate(0, i -> i < arrlist.size(), i -> i + position)
        .mapToObj(i -> arrlist.subList(i, Math.min((i + position), arrlist.size())))
        .collect(Collectors.toList());

【讨论】:

  • 可以用IntStream.iterate(0, i -&gt; i &lt; arrlist.size(), i -&gt; i += position)代替rangefilter
  • @k314159 此方法仅适用于 Java 9,但我也将此添加到答案中。谢谢
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2014-03-12
  • 2016-06-30
  • 2013-08-22
  • 1970-01-01
相关资源
最近更新 更多