当前位置: 首页 > 知识库问答 >
问题:

如何根据特定标准将一个流拆分为多个流?

堵昊焱
2023-03-14

我有一个整数列表,我想使用Java8流返回这个列表中的整数子列表,其中我的子列表在遇到一个负整数之前包含了原始列表中的所有正整数

例如,假设我的列表中有元素

[1 , 2 , 0 , -1 , 5 , 8 , 9 , -11 , 7 , 13 ]

然后我应该返回包含

  [1 , 2 , 0 ] [ 5 , 8 , 9 ] [7 , 13]  

我尝试了以下方法,但它不起作用,你的方向

package Java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

public class StreamsExamples {

    public static void main(String[] args) {
        ArrayList<Integer> arr = new ArrayList<Integer>();
        arr.add(1);
        arr.add(2);
        Integer[] al = new Integer[]{0,-1,5,8,9,-11,7,13};
        arr.addAll(Arrays.asList(al));
        arr.stream().collect(Collectors.groupingBy(Functionality::getPositiveList));
        // arr.stream().collect(Collectors.toList()).;
        //arr.stream().sorted().forEach(System.out::print);
    }


}

class Functionality{

    public List<List<Integer>> getPositiveList(List<Integer> list){
        List<List<Integer>> li = new ArrayList<List<Integer>>();
        List<Integer> a = new ArrayList<Integer>();
        for(int i=0;i<list.size();i++) {
            if(list.get(i)>=0) {
                a.add(list.get(i));
            }
            else if (list.get(i)<0) {
                li.add(a);
                a.clear();
            }
        }
        return li;

    }
}

共有2个答案

孙辰阳
2023-03-14

这有点难看,但这是可行的:

List<List<Integer>> lists = Arrays.stream(arr).boxed()
    .reduce(
        new ArrayList<>(),
        (l, i) -> {
            if (l.isEmpty() || i < 0) {
                l.add(new ArrayList<>());
            }
            if (i >= 0) {
                l.get(l.size() - 1).add(i);
            }
            return l;
        }, (a, b) -> {
            a.addAll(b);
            return a;
        });

测试:

int [] arr = {1, 2, 0, -1, 5, 8, 9, -11, 7, 13};

List<List<Integer>> lists = Arrays.stream(arr).boxed().reduce(new ArrayList<>(),
        (l, i) -> {
            if (l.isEmpty() || i < 0) {
                l.add(new ArrayList<>());
            }
            if (i >= 0) {
                l.get(l.size() - 1).add(i);
            }
            return l;
        }, (a, b) -> {
            a.addAll(b);
            return a;
        });

System.out.println(lists);

输出:

[[1, 2, 0], [5, 8, 9], [7, 13]]
秦英发
2023-03-14

如果您认为这里有点不同,那么这并不难:找出负值所在的索引,然后在这些索引之间做一个子列表。。。IntStream有一些怪癖。of(-1)(但我会让您弄明白为什么会是这样:尝试用更直观的IntStream.of(0)替换它,看看发生了什么)。所以有一个输入,比如:

ArrayList<Integer> arr = List.of(1, 2, 0, -1, 5, 8, 9, -11, 7, 13);

首先查找索引:

int[] indexes = IntStream.concat(
IntStream.of(-1),
IntStream.concat(
      IntStream.range(0, arr.size())
               .filter(x -> arr.get(x) < 0),
      IntStream.of(arr.size())))
         .toArray();

System.out.println(Arrays.toString(indexes));

这将产生如下结果:[-1,3,7,10]

因此,只需计算以下之间的subList

IntStream.range(0, indexes.length - 1)
         .mapToObj(x -> arr.subList(indexes[x] + 1, indexes[x + 1]))
         .collect(Collectors.toList())
         .forEach(System.out::println);
 类似资料:
  • 嘿,伙计们,我有一个程序,它读取csv文件,随机生成数据并将其转储到另一个csv文件中...现在我有一个csv文件,其中有100列,其中30列属于其他一些数据,但在最后生成时,我想通过附加一些对csv文件通用的公共列将这些数据分割成两个不同的csv文件。这是csv示例数据: 在这种情况下,两个文件都有一个共同点,因此输出数据应该如下所示: 为了得到一个带有所有条件的csv文件,我写了一个代码,这是

  • 我有一个Akka Streams,我想根据谓词将其分成两个源。 例如。有一个源(类型被有意简化): 还有两种方法: 我希望能够拆分根据谓词,并将右侧部分传递给方法,左侧部分传递给方法。 我尝试使用拆分器,但它需要s结尾。

  • 问题内容: 我有一个带有多个列以及一个日期列的数据框。日期格式为15年12月31日,我将其设置为日期时间对象。 我将datetime列设置为索引,并希望对数据框的每个月执行回归计算。 我相信实现此目的的方法是将数据框基于月份拆分为多个数据框,存储到数据框列表中,然后对列表中的每个数据框执行回归。 我使用过groupby可以按月成功拆分数据框,但是不确定如何正确地将groupby对象中的每个组转换为

  • 我有一个字符串和一个ArrayList。字符串中有几个单词,用空格隔开,例如“firstword second third”。我想将字符串拆分为几个部分,并将“piece”字符串添加到ArrayList中。

  • 问题内容: 如何在相同大小(= 10)的多个ArrayList中拆分ArrayList(size = 1000)? 问题答案: 你可以用来查看原始列表的一部分。 从API: 返回此列表在指定的(包括)和(不包括)之间的视图。(如果和相等,则返回的列表为空。)返回的列表由该列表支持,因此返回的列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。 例: Syst

  • 问题内容: 我得到一个包含以下内容的文本文件(12 MB): 有什么办法来分流到12个* .txt文件让说,,(......)? 问题答案: 您可以使用linux bash核心实用程序 注意,或两者都OK,但大小不同。MB为1000 * 1000,M为1024 ^ 2 如果要按行分隔,可以使用参数。 更新 Kirill建议的另一种解决方案,您可以执行以下操作 请注意,是不是,有几个选项,比如,,,