gpt4 book ai didi

java - 如何使用 java 8 流和功能接口(interface)过滤掉这个列表?

转载 作者:行者123 更新时间:2023-11-29 03:18:41 25 4
gpt4 key购买 nike

如果我有一个这样的数组列表(伪 java 代码):

请注意列表 valsSorted 将始终按 x[0] asc 和 x[1] desc 顺序排序。

List valsSorted = {[1 5][1 4][1 3][2 1][3 2][3 1][4 2][4 1][5 1][6 2][6 1]};

如何使用 Java 8 流和 lambda 过滤此列表,以便获得:

result  = {[1 5][2 1][3 2][4 2][5 1][6 2]}

数组(x[0])的第一项是ID,第二项是版本号。所以规则是返回所有具有最高版本的不同 ID。

如果我使用 for 循环,下面的代码就可以了:

 ArrayList<int[]> result= new ArrayList();
int keep = -1;
for (int[] x : valsSorted) {
int id = x[0];
int version = x[1];
if(keep == id) continue;
keep = id;
result.add(x);
}

最佳答案

您对“distinct”一词的使用建议使用 distinct() 流操作。不幸的是,该操作被硬连线为使用流元素的 equals() 方法,这对数组没有用。处理这个问题的一种方法是将数组包装在一个包装对象中,该对象具有您正在寻找的相等语义:

class Wrapper {
final int[] array;

Wrapper(int[] array) { this.array = array; }

int[] getArray() { return array; }

@Override
public boolean equals(Object other) {
if (! (other instanceof Wrapper))
return false;
else
return this.array[0] == ((Wrapper)other).array[0];
}

@Override
public int hashCode() { ... }
}

然后在 distinct() 之前包装你的对象并在之后打开它:

List<int[]> valsDistinct =
valsSorted.stream()
.map(Wrapper::new)
.distinct()
.map(Wrapper::getArray)
.collect(toList());

这使得一次传递数据但它为每个值生成一个垃圾对象。这也依赖于按顺序处理的流元素,因为您需要第一个。

另一种方法是使用某种有状态的收集器,但这最终会在任何后续处理开始之前存储整个结果列表,您说过要避免这种情况。

可能值得考虑使数据元素成为实际的类而不是双元素数组。通过这种方式,您可以提供合理的相等性概念,还可以使值具有可比性,以便您可以轻松地对它们进行排序。

(来源:从 this answer 窃取的技术。)

关于java - 如何使用 java 8 流和功能接口(interface)过滤掉这个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com