package com.levelup.java.collections;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.apache.log4j.Logger;
import org.junit.Ignore;
import org.junit.Test;
import com.google.common.collect.Lists;
/**
* This java example will demonstrate partitioning a list, or breaking a list
* into sublists based on specified size.
*
* @author Justin Musgrove
* @see <a
* href='http://www.leveluplunch.com/java/examples/partition-list/'>Partiti
* o n a list</a>
*
*/
public class PartitionList {
private static final Logger logger = Logger.getLogger(PartitionList.class);
List<String> playerDecisions = Lists.newArrayList("Hit", "Stand",
"Double down", "Split", "Surrender");
@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"));
}
@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);
}
@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"));
}
@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)
}
}