最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Java中對List進行分區(qū)的實現(xiàn)方法

 更新時間:2024年04月09日 09:39:17   作者:捕蟲者說  
在本文中,我們將說明如何將一個列表拆分為多個給定大小的子列表,也就是說在 Java 中如何對List進行分區(qū),文中有詳細的代碼示例供大家參考,需要的朋友可以參考下

1. 概述

在本文中,我們將說明如何將一個列表拆分為多個給定大小的子列表。

對于這個相對簡單的操作,標準 Java 集合 API 竟然不支持它。幸運的是,GuavaApache-Commons 都提供了對應的 API 。

2. 使用 Guava 對 List 進行分區(qū)

Guava 通過Lists.partition 操作將 List 劃分為指定大小 的子列表:

List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subSets = Lists.partition(intList, 3);
subSets.forEach(s -> log.info("{}", s));

List<Integer> lastPartition = subSets.get(2);
List<Integer> expectedLastPartition = Lists.newArrayList(7, 8);

Assertions.assertEquals(subSets.size(), 3);
Assertions.assertEquals(lastPartition, expectedLastPartition);

下面是我們得到的輸出結(jié)果:

[1, 2, 3]
[4, 5, 6]
[7, 8]

3. 使用 Guava 對集合進行分區(qū)

Guava 也可以對集合進行分區(qū):

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.newArrayList(1, 2, 3);
Assertions.assertEquals(firstPartition, expectedLastPartition);

請記住,分區(qū)是原始集合的子列表視圖, 這意味著原始集合中的更改將反映在分區(qū)中:

@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));
}

4. 使用 Apache Commons Collections 對列表進行分區(qū)

Apache Commons Collections 的最新版本最近也添加了對列表分區(qū)的支持:

@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));
}

Commons Collections 沒有相應的選項來對原始集合進行分區(qū), 類似于 Guava Iterables.partition。

最后,同樣的警告也適用于此:生成的分區(qū)是原始列表的視圖。

5. 使用Java8對列表進行分區(qū)

現(xiàn)在讓我們看看如何使用 Java8 對我們的 List 進行分區(qū)。

5.1 收集器分區(qū)方式

我們可以使用Collectors.partitioningBy() 將列表拆分為 2 個子列表:

@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));
}

注意:生成的分區(qū)不是主列表的視圖,因此主列表發(fā)生的任何更改都不會影響分區(qū)。

5.2 收藏家分組方式

我們還可以使用Collectors.groupingBy() 將我們的列表分成多個分區(qū):

@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));
}

注意:與Collectors.partitioningBy() 一樣, 生成的分區(qū)不會受到主列表更改的影響。

5.3 按分隔符拆分列表

我們還可以使用 Java8 按分隔符拆分我們的列表:

@Test
public void givenList_whenSplittingBySeparator_thenCorrect() {
    List<Integer> intList = Lists.newArrayList(1, 2, 3, 0, 4, 5, 6, 0, 7, 8);

    int[] indexes = 
      Stream.of(IntStream.of(-1), IntStream.range(0, intList.size())
      .filter(i -> intList.get(i) == 0), IntStream.of(intList.size()))
      .flatMapToInt(s -> s).toArray();
    List<List<Integer>> subSets = 
      IntStream.range(0, indexes.length - 1)
               .mapToObj(i -> intList.subList(indexes[i] + 1, indexes[i + 1]))
               .collect(Collectors.toList());

    List<Integer> lastPartition = subSets.get(2);
    List<Integer> expectedLastPartition = Lists.<Integer> newArrayList(7, 8);
    assertThat(subSets.size(), equalTo(3));
    assertThat(lastPartition, equalTo(expectedLastPartition));
}

注意:我們使用“0”作為分隔符。我們首先獲取了 List 中所有“0”元素的索引,然后我們根據(jù)這些索引拆分了List。

6. 結(jié)論

此處介紹的解決方案使用了額外的庫,即 Guava 和 Apache Commons Collections。這兩者都非常輕量級并且總體上非常有用,因此將其中之一放在類路徑中是非常有意義的。

到此這篇關(guān)于在Java中對List進行分區(qū)的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java對List分區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot?中事務的用法示例詳解

    Spring?Boot?中事務的用法示例詳解

    本文詳細介紹了Spring Boot中事務管理的使用方法,包括事務的基本概念、配置、傳播行為、隔離級別以及回滾機制,通過使用@Transactional注解,可以方便地實現(xiàn)事務的控制,文章還討論了事務方法的可見性、自我調(diào)用問題以及超時設(shè)置等注意事項,感興趣的朋友一起看看吧
    2025-02-02
  • java 字符串相減(很簡單的一個方法)

    java 字符串相減(很簡單的一個方法)

    本篇文章是對java中關(guān)于字符串相減的一個簡單的方法進行了介紹,需要的朋友參考下
    2013-07-07
  • 簡單了解springboot中的配置文件相關(guān)知識

    簡單了解springboot中的配置文件相關(guān)知識

    這篇文章主要介紹了簡單了解springboot中的配置文件相關(guān)知識,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Spring中的依賴注入DI詳解

    Spring中的依賴注入DI詳解

    這篇文章主要介紹了Spring中的依賴注入DI詳解,組件之間依賴關(guān)系由容器在運行期決定,形象的說,即由容器動態(tài)的將依賴關(guān)系注入到組件之中,依賴注入的目的并非為軟件系統(tǒng)帶來更多功能,是為了提升組件重用的頻率,并為系統(tǒng)搭建一個靈活、可擴展的平臺,需要的朋友可以參考下
    2024-01-01
  • Spring Boot集成Java DSL的實現(xiàn)代碼

    Spring Boot集成Java DSL的實現(xiàn)代碼

    這篇文章主要介紹了Spring Boot集成Java DSL的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • 實例講解Java并發(fā)編程之變量

    實例講解Java并發(fā)編程之變量

    這篇文章主要介紹了實例講解Java并發(fā)編程之變量,本文講解了編寫線程安全需要關(guān)心的共享變量和可變變量,需要的朋友可以參考下
    2015-04-04
  • 深入了解Java核心類庫--Arrays類

    深入了解Java核心類庫--Arrays類

    這篇文章主要為大家詳細介紹了java Arrays類定義與使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07
  • Java多線程Callable接口實現(xiàn)代碼示例

    Java多線程Callable接口實現(xiàn)代碼示例

    相信大家對Java編程中如何創(chuàng)建線程已經(jīng)不陌生了,這篇文章就向朋友們介紹實現(xiàn)callable接口,具體實例詳見正文。
    2017-10-10
  • springBoot中myBatisPlus的使用步驟及示例代碼

    springBoot中myBatisPlus的使用步驟及示例代碼

    MyBatis-Plus 是一個 MyBatis 的增強工具,在 Spring Boot 項目里使用它能極大提升開發(fā)效率,下面為你詳細介紹在 Spring Boot 中使用 MyBatis-Plus 的步驟以及示例代碼,感興趣的朋友一起看看吧
    2025-03-03
  • Java中的常量避免反模式的方法

    Java中的常量避免反模式的方法

    這篇文章主要介紹了Java中的常量避免反模式的方法,需要的朋友可以參考下
    2015-12-12

最新評論

高雄县| 抚宁县| 宁城县| 平果县| 大名县| 台中市| 乌兰县| 库车县| 监利县| 万荣县| 红原县| 东乌珠穆沁旗| 葵青区| 嵊州市| 垦利县| 张掖市| 东莞市| 兴业县| 卢湾区| 江西省| 肃北| 色达县| 新疆| 隆德县| 北宁市| 大埔区| 博野县| 张家口市| 五河县| 内丘县| 梅河口市| 大化| 太仆寺旗| 兴山县| 昔阳县| 新兴县| 夹江县| 阳江市| 乌恰县| 仪征市| 酉阳|