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) 能即为全部的元素对象。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论