欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 概述

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

對(duì)于這個(gè)相對(duì)簡單的操作,標(biāo)準(zhǔn) Java 集合 API 竟然不支持它。幸運(yùn)的是,GuavaApache-Commons 都提供了對(duì)應(yīng)的 API 。

2. 使用 Guava 對(duì) List 進(jìn)行分區(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 對(duì)集合進(jìn)行分區(qū)

Guava 也可以對(duì)集合進(jìn)行分區(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 對(duì)列表進(jìn)行分區(qū)

Apache Commons Collections 的最新版本最近也添加了對(duì)列表分區(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 沒有相應(yīng)的選項(xiàng)來對(duì)原始集合進(jìn)行分區(qū), 類似于 Guava Iterables.partition。

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

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

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

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

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

@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ā)生的任何更改都不會(huì)影響分區(qū)。

5.2 收藏家分組方式

我們還可以使用Collectors.groupingBy() 將我們的列表分成多個(gè)分區(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ū)不會(huì)受到主列表更改的影響。

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。這兩者都非常輕量級(jí)并且總體上非常有用,因此將其中之一放在類路徑中是非常有意義的。

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

相關(guān)文章

  • java編程之AC自動(dòng)機(jī)工作原理與實(shí)現(xiàn)代碼

    java編程之AC自動(dòng)機(jī)工作原理與實(shí)現(xiàn)代碼

    這篇文章主要介紹了java編程之AC自動(dòng)機(jī)的有關(guān)內(nèi)容,涉及其應(yīng)用場景,運(yùn)行原理,運(yùn)行過程,構(gòu)造方法及Java中的實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot 開發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

    SpringBoot 開發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI

    這篇文章主要介紹了SpringBoot 開發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java NIO實(shí)現(xiàn)群聊系統(tǒng)

    Java NIO實(shí)現(xiàn)群聊系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java NIO實(shí)現(xiàn)群聊系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java多線程并發(fā)編程(互斥鎖Reentrant Lock)

    Java多線程并發(fā)編程(互斥鎖Reentrant Lock)

    這篇文章主要介紹了ReentrantLock 互斥鎖,在同一時(shí)間只能被一個(gè)線程所占有,在被持有后并未釋放之前,其他線程若想獲得該鎖只能等待或放棄,需要的朋友可以參考下
    2017-05-05
  • MyBatis中多條件查詢商品的三種方法及區(qū)別

    MyBatis中多條件查詢商品的三種方法及區(qū)別

    本文主要介紹了MyBatis中多條件查詢商品的三種方法及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Javaweb會(huì)話跟蹤技術(shù)Cookie和Session的具體使用

    Javaweb會(huì)話跟蹤技術(shù)Cookie和Session的具體使用

    本文主要介紹了Javaweb會(huì)話跟蹤技術(shù)Cookie&Session的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java中字符串與日期的轉(zhuǎn)換實(shí)例

    java中字符串與日期的轉(zhuǎn)換實(shí)例

    java中字符串與日期的轉(zhuǎn)換實(shí)例,需要的朋友可以參考一下
    2013-05-05
  • Java實(shí)現(xiàn)代碼塊耗時(shí)測算工具類

    Java實(shí)現(xiàn)代碼塊耗時(shí)測算工具類

    這篇文章主要為大家介紹了如何利用Java語言編寫一個(gè)工具類,用來測算代碼塊的耗時(shí),同時(shí)還能顯示進(jìn)度,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • 如何使用Java?8中DateTimeFormatter類型轉(zhuǎn)換日期格式詳解

    如何使用Java?8中DateTimeFormatter類型轉(zhuǎn)換日期格式詳解

    這篇文章主要介紹了如何使用Java?8中DateTimeFormatter類型轉(zhuǎn)換日期格式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • java爬蟲jsoup解析HTML的工具學(xué)習(xí)

    java爬蟲jsoup解析HTML的工具學(xué)習(xí)

    jsoup是一個(gè)解析HTML的第三方j(luò)ava庫,它提供了一套非常方便的API,可使用DOM,CSS以及類jQuery的操作方法來取出和操作數(shù)據(jù),本文就來開始jsoup的使用學(xué)習(xí)
    2022-07-07

最新評(píng)論