作者:蒋军利 | 来源:互联网 | 2023-01-30 09:33
我有一个具体的问题.有一些类似的问题,但这些问题要么是Python,要么是Java,或者即使问题听起来相似,要求也不同.
我有一个值列表.
List1 = {10, -2, 23, 5, -11, 287, 5, -99}
在一天结束时,我想根据它们的值拆分列表.我的意思是如果该值大于零,它将保留在原始列表中,并且负值列表中的相应索引将被设置为零.如果该值小于零,则它将转到负值列表,原始列表中的负值将替换为零.
结果列表应该是这样的;
List1 = {10, 0, 23, 5, 0, 287, 5, 0}
List2 = {0, -2, 0, 0, -11, 0, 0, -99}
有没有办法用Java中的Stream api来解决这个问题?
1> Holger..:
如果您想在单个Stream操作中执行此操作,则需要一个自定义收集器:
List list = Arrays.asList(10, -2, 23, 5, -11, 287, 5, -99);
List> result = list.stream().collect(
() -> Arrays.asList(new ArrayList<>(), new ArrayList<>()),
(l,i) -> { l.get(0).add(Math.max(0, i)); l.get(1).add(Math.min(0, i)); },
(a,b) -> { a.get(0).addAll(b.get(0)); a.get(1).addAll(b.get(1)); });
System.out.println(result.get(0));
System.out.println(result.get(1));
2> 小智..:
Map> results=
List1.stream().collect(Collectors.partitioningBy( n -> n <0));
我认为这是一个更漂亮且易于阅读的东西。(然后,您可以从地图中获得否定和非否定列表。)
3> Robin Topper..:
正如shmosel在评论中已经指出的那样,你需要使用两个迭代:
List list = Arrays.asList(10, -2, 23, 5, -11, 287, 5, -99);
List positives = list.stream().map(i -> i <0 ? 0 : i).collect(Collectors.toList());
List negatives = list.stream().map(i -> i <0 ? i : 0).collect(Collectors.toList());
如果您的列表是可修改的,则可以在一个流中进行所有操作.这并不比for-loop好
List list = Arrays.asList(10, -2, 23, 5, -11, 287, 5, -99);
List list2 = new ArrayList<>();
IntStream.range(0, list.size()).forEach(i -> {
int j;
if ((j = list.get(i)) <0) {
list2.add(j);
list.set(i, 0);
} else {
list2.add(0);
}});