我有一个整数列表,我想使用Java 8流从该列表返回整数子列表,其中我的子列表在遇到负整数之前就包含原始列表中的所有正整数
例如假设我的列表中有元素
[[ ! 'foo.png' =~ \.(jpe?g|png)$ ]] && echo not a image
然后我应该返回包含
的子列表class foo {
int x;
double y;
}
void main() {
final a = List<foo>();
List<foo> b;
print(a.runtimeType);
print(b.runtimeType);
}
我尝试了以下方法,但是它没有用,非常感谢您的指导和投入。
[1 , 2 , 0 , -1 , 5 , 8 , 9 , -11 , 7 , 13 ]
答案 0 :(得分:5)
如果您在这里有一些不同的话,这并不难:找出负值所在的索引,然后在这些索引之间做一个subList
... {{1 }}(但我会让您弄清楚为什么会这样:尝试用更直观的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
答案 1 :(得分:2)
这有点丑陋,但这可行:
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]]