Java Top.

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>看看这个课程

1.概述

在本教程中,我将对此进行说明如何把一个列表分成几个子列表给定大小的。

对于一个相对简单的操作,标准Java集合api中不支持这种操作。幸运的是,这两个番石榴Apache Commons集合以类似的方式实施了操作。

本文是其中的一部分Java - 返回基本“ 系列在Baeldun雷竞技app下载官方版isog这里。

进一步阅读:

在Java中将列表转换为字符串

了解如何使用不同技术将列表转换为字符串。

在Java中变换集合

学习如何在Java中洗牌各种集合。

java中的溅射器介绍

了解可用于遍雷竞技app官网网站历和分区序列的扫描仪接口。

2.使用番石榴分区列表

番石榴有助于将List划分为指定大小的子列表Lists.partition手术

@test public void给gentlist_whenparitioningintonsublist_thencorrect(){list <整数> intlist = lists.newarraylist(1,2,3,4,5,6,7,8);列表>子集= lists.partition(Intlist,3);列表<整数> lastPartition = subset.get(2);列表<整数>预期的rastpartition = lists。<整数> newArrayList(7,8);assertthat(subsets.size(),等于(3));为了(lastPartition等于(expectedLastPartition));}

3.使用Guava分区集合

分区集合番石榴也是可能的:

@Test public void givencollection_whenparitioningintonsublists_thorrect () {Collection intCollection = Lists. class = "集合";newArrayList(1, 2, 3, 4, 5, 6, 7, 8);Iterable> subSets = Iterables。分区(intCollection 3);List firstPartition = subSets.iterator().next();List expectedLastPartition = Lists。 newArrayList(1, 2, 3);为了(firstPartition等于(expectedLastPartition));}

请记住分区是最先进的原始集合的观点-这意味着原始集合的变化将反映在分区中:

@Test public void givenlistpartitioned_whenoriginallisttismodified_thenpartitionschangeaswell(){//给定列表 intList = Lists。newArrayList(1, 2, 3, 4, 5, 6, 7, 8);列表>子集= lists.partition(Intlist,3);/ /当intList.add (9);//然后List lastPartition = subSets.get(2);List expectedLastPartition = Lists。 newArrayList(7,8,9);为了(lastPartition等于(expectedLastPartition));}

4.使用Apache Commons集合对列表进行分区

Apache Commons Collections的最新版本有最近添加的对List分区的支持:

@test public void给gentlist_whenparitioningintonsublist_thencorrect(){list <整数> intlist = lists.newarraylist(1,2,3,4,5,6,7,8);列表>子集= listutils.partition(Intlist,3);列表<整数> lastPartition = subset.get(2);列表<整数>预期的rastpartition = lists。<整数> newArrayList(7,8);assertthat(subsets.size(),等于(3));为了(lastPartition等于(expectedLastPartition));}

没有对应的选项来分区原始Collection- 类似于Guava iterables.partition在Commons Collections中。

最后,同样的警告也适用于这里——生成的分区是原始List的视图。

5.使用Java8分区列表

现在,让我们看看如何使用java8分区我们的列表。

5.1。收藏家分区

我们可以使用Collectors.partitioningBy ()将列表分成2个子列表,如下所示:

@test public void给gentlist_whenparitioningintosublistususingpartitionby_thencorrect(){list <整数> intlist = lists.newarraylist(1,2,3,4,5,6,7,8);地图<布尔值,列表<整数>>组= Intlist.stream()。收集(收集器.PartitionBy(S  - > S> 6));列表>子集= new arraylist >(组.values());列表<整数> lastPartition = subsets.get(1);列表<整数>预期的rastpartition = lists。<整数> newArrayList(7,8);assertthat(subsets.size(),等于(2));为了(lastPartition等于(expectedLastPartition));}

注意:生成的分区不是主列表的视图,因此主列表中发生的任何更改都不会影响分区。

5.2。收藏家分组

我们也可以使用Collectors.groupingBy ()要将列表拆分为多个分区:

@Test公共最终void给rist_whenparitioningintonsublistususinggroupingby_thencorrect(){list  intlist = lists.newarraylist(1,2,3,4,5,6,7,8);映射<整数,列表<整数>>组= Intlist.Stream()。收集(收集器.groupBy(S  - >(S->(S-1)/ 3));列表>子集= new arraylist >(组.values());列表<整数> lastPartition = subset.get(2);列表<整数>预期的rastpartition = lists。<整数> newArrayList(7,8);assertthat(subsets.size(),等于(3));为了(lastPartition等于(expectedLastPartition));}

注意:就像Collectors.partitioningBy ()-生成的分区不会受主列表变化的影响。

5.3。分隔符拆分列表

我们也可以使用Java8通过分隔符来分割List:

@test public void给gentlist_whenplittybyseparator_thencorrect(){list  intlist = lists.newarraylist(1,2,3,0,4,5,6,0,7,8);int [] indexes = stream.of(IntStream.of(-1),IntStream.Range(0,Intlist.size()).filter(i  - > Intllist.get(i)== 0),IntStream.of(Intlist.size())).flatmaptoint(s  - > s).toarray();列表> subet = intstream.range(0,indexes.length  -  1).maptoobj(i  - > Intlist.sublist(索引[i] + 1,索引[i + 1])).collect(收集器.tolist());列表<整数> lastPartition = subset.get(2);列表<整数>预期的rastpartition = lists。<整数> newArrayList(7,8);assertthat(subsets.size(),等于(3));为了(lastPartition等于(expectedLastPartition));}

注意:我们使用“0”作为分隔符 - 我们首先获得了列表中所有“0”元素的指标,然后我们分开了列表在这些指数上。

六,结论

这里展示的解决方案利用了其他库 - Guava或Apache Commons Collections库。这两种都非常轻,整体非常有用,因此在类路径上拥有其中一个是完美的意义;但是,如果这不是一个选项 - 只有一个java解决方案这里显示

所有这些示例和代码片段的实现能够被找到的在GitHub-这是一个基于maven的项目,所以它应该很容易导入和运行。

Java底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>看看这个课程
对这篇文章的评论关闭!