使用 lambda 函数进行 Java 排序

Java sorting with lambda function

提问人:Arya 提问时间:6/8/2023 最后编辑:marstranArya 更新时间:6/8/2023 访问量:48

问:

有人可以将此函数转换为 lambda 函数吗?我猜我在打字时遇到了一些麻烦。请帮忙

Arrays.sort(arr, new Comparator<Item>() {
    @Override
    public int compare(Item item1, Item item2) {
        double cpr1 = new Double((double) item1.value / (double) item1.weight);
        double cpr2 = new Double((double) item2.value / (double) item2.weight);
 
        if (cpr1 < cpr2) {
            return 1;
        } else {
            return -1;
        }
    }
});
Java 排序 比较 比较器

评论

0赞 Sweeper 6/8/2023
什么?Item
0赞 Jorn 6/8/2023
使用 IDE 并应用“转换为 lambda”快速修复。
5赞 marstran 6/8/2023
与问题无关,但您的比较器是错误的。如果值相等,则返回 0,而不是 -1。
0赞 Arya 6/8/2023
@Sweeper Item 是一个具有两个属性的类,int value 和 int weight。
1赞 David Conrad 6/9/2023
你为什么要使用?所做的就是将 A 装箱,然后立即拆箱。也许编译器会意识到这一点并为你消除它,但它没有任何作用。new DoubledoubleDouble

答:

0赞 Gabriel Eriksson 6/8/2023 #1
public static void main(String[] args) {
  var arr = new Item[]{}; 
  Arrays.sort(arr, MyClass::useMySorting);
}

private static int useMySorting(Item item1, Item item2) {
  double cpr1 = new Double((double) item1.value / (double) item1.weight);
  double cpr2 = new Double((double) item2.value / (double) item2.weight);
  if (cpr1 < cpr2)
    return 1;
  else
    return -1;
}

评论

1赞 alea 6/8/2023
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
1赞 Arya 6/8/2023 #2

我尝试了几件事,终于找到了解决方案:

Arrays.sort(arr, (item1, item2) -> Double.compare((double) item2.value / item2.weight, (double) item1.value / item1.weight));

这将解决问题。

评论

1赞 Holger 6/14/2023
更简单:Arrays.sort(arr, Comparator.comparingDouble(item -> (double)item.value / item.weight));