java将list按照指定数量分成小list
自己编写相关代码:
使用guava
import java.util.arraylist;
import java.util.list;
import com.google.common.collect.lists;
public class test4 {
public static void main(string[] args) {
list<long> list = new arraylist<>();
list.add(1l);
list.add(2l);
list.add(3l);
list.add(4l);
list.add(5l);
list.add(6l);
list.add(7l);
list.add(8l);
list.add(9l);
//test1(list);
test2(list);
}
private static void test1(list<long> list) {
int size = 2;
list<list<long>> listarr = new arraylist<>();
int arrsize = list.size()%size==0?list.size()/size:list.size()/size+1;
for(int i=0;i<arrsize;i++) {
list<long> sub = new arraylist<>();
for(int j=i*size;j<=size*(i+1)-1;j++) {
if(j<=list.size()-1) {
sub.add(list.get(j));
}
}
listarr.add(sub);
}
system.out.println(listarr.tostring());
}
private static void test2(list<long> list) {
int size = 16;
list<list<long>> subsets = lists.partition(list, size);
system.out.println(subsets.tostring());
}
} 补充:guava分割其他collectionsiew plain
@test
public void givencollection_whenparitioningintonsublists_thencorrect() {
collection<integer> intcollection = lists.newarraylist(1, 2, 3, 4, 5, 6, 7, 8);
iterable<list<integer>> subsets = iterables.partition(intcollection, 3);
list<integer> firstpartition = subsets.iterator().next();
list<integer> expectedlastpartition = lists.<integer> newarraylist(1, 2, 3);
assertthat(firstpartition, equalto(expectedlastpartition));
} 以上需要注意的是:
partition返回的是原list的subview.视图,也即,原list改变后,partition之后的结果也会随着改变。
@test
public void givenlistpartitioned_whenoriginallistismodified_thenpartitionschangeaswell() {
// given
list<integer> intlist = lists.newarraylist(1, 2, 3, 4, 5, 6, 7, 8);
list<list<integer>> subsets = lists.partition(intlist, 3);
// when
intlist.add(9);
// then
list<integer> lastpartition = subsets.get(2);
list<integer> expectedlastpartition = lists.<integer> newarraylist(7, 8, 9);
assertthat(lastpartition, equalto(expectedlastpartition));
} 使用apache commons collection
@test
public void givenlist_whenparitioningintonsublists_thencorrect() {
list<integer> intlist = lists.newarraylist(1, 2, 3, 4, 5, 6, 7, 8);
list<list<integer>> subsets = listutils.partition(intlist, 3);
list<integer> lastpartition = subsets.get(2);
list<integer> expectedlastpartition = lists.<integer> newarraylist(7, 8);
assertthat(subsets.size(), equalto(3));
assertthat(lastpartition, equalto(expectedlastpartition));
} - 没有对应的iterable.partions方法,类似guava那样
- partition后的结果同样是原集合的视图。
java8方法
1)通过grouping by:
@test
public final void givenlist_whenparitioningintonsublistsusinggroupingby_thencorrect() {
list<integer> intlist = lists.newarraylist(1, 2, 3, 4, 5, 6, 7, 8);
map<integer, list<integer>> groups =
intlist.stream().collect(collectors.groupingby(s -> (s - 1) / 3));
list<list<integer>> subsets = new arraylist<list<integer>>(groups.values());
list<integer> lastpartition = subsets.get(2);
list<integer> expectedlastpartition = lists.<integer> newarraylist(7, 8);
assertthat(subsets.size(), equalto(3));
assertthat(lastpartition, equalto(expectedlastpartition));
} 按年龄分组:
map<integer, list<person>> persongroups = stream.generate(new personsupplier()).
limit(100).
collect(collectors.groupingby(person::getage));
iterator it = persongroups.entryset().iterator();
while (it.hasnext()) {
map.entry<integer, list<person>> persons = (map.entry) it.next();
system.out.println("age " + persons.getkey() + " = " + persons.getvalue().size());
} 2)通过partition by:
@test
public void givenlist_whenparitioningintosublistsusingpartitionby_thencorrect() {
list<integer> intlist = lists.newarraylist(1, 2, 3, 4, 5, 6, 7, 8);
map<boolean, list<integer>> groups =
intlist.stream().collect(collectors.partitioningby(s -> s > 6));
list<list<integer>> subsets = new arraylist<list<integer>>(groups.values());
list<integer> lastpartition = subsets.get(1);
list<integer> expectedlastpartition = lists.<integer> newarraylist(7, 8);
assertthat(subsets.size(), equalto(2));
assertthat(lastpartition, equalto(expectedlastpartition));
} 按照成年未成年人分组:
map<boolean, list<person>> children = stream.generate(new personsupplier()).
limit(100).
collect(collectors.partitioningby(p -> p.getage() < 18));
system.out.println("children number: " + children.get(true).size());
system.out.println("adult number: " + children.get(false).size()); 注意:
1.java8方式,分组后的list不再是原list的视图。所以,原list的改变不会影响分组后的结果。
2partitioningby 其实是一种特殊的 groupingby,它依照条件测试的是否两种结果来构造返回的数据结构,get(true) 和 get(false) 能即为全部的元素对象。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论