当前位置: 代码网 > it编程>编程语言>Java > java如何将list按照指定数量分成小list

java如何将list按照指定数量分成小list

2024年11月20日 Java 我要评论
java将list按照指定数量分成小list自己编写相关代码:使用guavaimport java.util.arraylist; import java.util.list; import co

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) 能即为全部的元素对象。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com