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

 更新时间:2024年11月19日 10:55:41   作者:赶路人儿  
本文介绍了四种不同的方法对集合进行分区操作,包括手动编写代码、使用Guava库、Apache Commons Collection库以及Java 8的流操作,每种方法都有其特点和适用场景,需要注意的是,部分方法返回的是原集合的视图,而部分则返回的是新的集合

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • maven如何打包动态环境变量(包括启动脚本)

    maven如何打包动态环境变量(包括启动脚本)

    这篇文章主要介绍了maven如何打包动态环境变量(包括启动脚本)问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring Boot中的过滤器拦截器监听器使用技巧汇总

    Spring Boot中的过滤器拦截器监听器使用技巧汇总

    本文将介绍在Spring Boot应用程序中使用过滤器、拦截器和监听器的使用技巧,我们将讨论它们之间的区别,以及何时使用它们,我们还将提供代码示例,以帮助您在自己的应用程序中使用它们
    2023-12-12
  • Java基础题新手练习(一)

    Java基础题新手练习(一)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Java 图解Spring启动时的后置处理器工作流程是怎样的

    Java 图解Spring启动时的后置处理器工作流程是怎样的

    spring的后置处理器有两类,bean后置处理器,bf(BeanFactory)后置处理器。bean后置处理器作用于bean的生命周期,bf的后置处理器作用于bean工厂的生命周期
    2021-10-10
  • Java 详细讲解分治算法如何实现归并排序

    Java 详细讲解分治算法如何实现归并排序

    分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解,本篇文章我们就用分治算法来实现归并排序
    2022-04-04
  • 深入理解Java设计模式之中介者模式

    深入理解Java设计模式之中介者模式

    这篇文章主要介绍了JAVA设计模式之中介者模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解
    2021-11-11
  • TCC分布式事务七种异常情况小结

    TCC分布式事务七种异常情况小结

    这篇文章主要为大家详细介绍了在整个TCC模型过程中可能会出现的七种异常情况,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • python 与HFSS联合仿真的教程讲解

    python 与HFSS联合仿真的教程讲解

    这篇文章主要介绍了python 与HFSS联合仿真的教程讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Java Web 登录页面的实现代码实例

    Java Web 登录页面的实现代码实例

    这篇文章主要介绍了Java Web 登录页面的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 校验非空的注解@NotNull如何取得自定义的message

    校验非空的注解@NotNull如何取得自定义的message

    这篇文章主要介绍了校验非空的注解@NotNull如何取得自定义的message,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09

最新评论