此示例将演示如何使用 java、java 8、guava 和 apache commons 对 ArrayList 进行分区。示例数据是一个字符串列表,这些字符串列表将按指定条件分解为多个子列表。
List<String> playerDecisions = Lists.newArrayList(
"Hit",
"Stand",
"Double down",
"Split",
"Surrender");
此代码段将使用 for 循环将字符串列表拆分为子列表。
@Test
public void partition_list_java () {
List<List<String>> decisionsBy2 = new ArrayList<List<String>>();
final int sizeOfList = playerDecisions.size();
final int breakApart = 2;
for (int i = 0; i < sizeOfList; i += breakApart) {
decisionsBy2.add(new ArrayList<String> (
playerDecisions.subList(i, Math.min(sizeOfList, i + breakApart)))
);
}
logger.info(decisionsBy2);
assertThat(decisionsBy2.get(0), hasItems("Hit", "Stand"));
assertThat(decisionsBy2.get(1), hasItems("Double down", "Split"));
assertThat(decisionsBy2.get(2), hasItems("Surrender"));
}
输出
[
[Hit, Stand],
[Double down, Split],
[Surrender]
]
使用 java 8,该片段将展示如何使用分区函数。分区函数将返回 Map < Boolean,List < String >> ,其中键是布尔值,结果基于predicate的行为。由 lambda 表达式创建,如果字符串以 's' 开头,显示的predicate将返回 true。生成的映射将具有以“s”开头的字符串集合,其中键等于 true,而字符串列表不以“s”开头。所以最多你会有两个键或两个不同的组。这种返回集合类型类似于 guava multimap。
@Test
public void partition_list_java8() {
Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s");
Map<Boolean, List<String>> decisionsByS = playerDecisions.stream()
.collect(Collectors.partitioningBy(startWithS));
logger.info(decisionsByS);
assertTrue(decisionsByS.get(Boolean.TRUE).size() == 3);
}
输出
{false=[Hit, Double down], true=[Stand, Split, Surrender]}
该示例将展示如何使用 guava 将 ArrayList 拆分为更小的数组列表。 Guava 的 Lists 集合实用分区方法将返回列表的子列表,每个子列表的大小相同,最后一个大小取决于元素的数量。
@Test
public void partition_list_guava () {
List<List<String>> decisionsBy2 = Lists.partition(playerDecisions, 2);
logger.info(decisionsBy2);
assertThat(decisionsBy2.get(0), hasItems("Hit", "Stand"));
assertThat(decisionsBy2.get(1), hasItems("Double down", "Split"));
assertThat(decisionsBy2.get(2), hasItems("Surrender"));
}
输出
[
[Hit, Stand],
[Double down, Split],
[Surrender]
]
此示例将展示如何使用 apache commons 将列表划分为多个列表。
@Ignore("Will be released in collections 4")
@Test
public void partition_list_apache_commons () {
// TODO not yet released, collections 4
// ListUtils.partition(playerDecisions, 2)
// http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/ListUtils.html#partition(java.util.List, int)
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : http://www.leveluplunch.com/java/examples/partition-list/
内容来源于网络,如有侵权,请联系作者删除!