Java流在求和后进行倒序排序

3
list
.parallelStream()
.sorted(Comparator.comparingDouble(r -> r.getA() + r.getB()).reversed())

我遇到了编译错误:无法解析方法 r.getA(),但是

list
.parallelStream()                                    
.sorted(Comparator.comparingDouble(r -> r.getA() + r.getB())

没问题,那么我该如何按照 r -> r.getA() + r.getB() 的方式进行排序并将其反转呢?


指定 r 的类型似乎解决了问题 .sorted(Comparator.comparingDouble((R r) -> r.getA() + r.getB()).reversed());. 或者 .sorted(Comparator.<R>comparingDouble(r -> r.getA() + r.getB()).reversed()); 也可以编译。 - Venkata Raju
2个回答

3

实现该目标的一种方法是将 ToDoubleFunction 进行类型转换,如下:

list.parallelStream()
    .sorted(Comparator.comparingDouble((ToDoubleFunction<C>) r -> r.getA() + r.getB())
            .reversed());

尽管我更喜欢明确地创建一个 Comparator<C>,如下所示:
list.parallelStream()
        .sorted(((Comparator<C>) (o1, o2) -> Double.compare(o1.getA() + o1.getB(), o2.getA() + o2.getB()))
                .reversed());

注意:这里的 C 是您的对象类型,也构成了所讨论的 list

2
顺便提一下,添加双精度浮点数的精度仍然是一个你需要研究的问题。 - Naman
2
在我看来,那个评论中的链接并没有充分解释清楚。我建议阅读 Knuth 的算法(是 Knuth 吗?)了解从较小的数字开始累加,然后再加上较大的数字的重要性。 - glglgl

0

以下是同一问题的三种解决方案。

Bean类

Item.java

public Item {

double lPrice;
double hPrice;

/**
 * @param lPrice
 * @param hPrice
 */
public Item(double lPrice, double hPrice) {
    super();
    this.lPrice = lPrice;
    this.hPrice = hPrice;
}

public double getlPrice() {
    return lPrice;
}

public void setlPrice(double lPrice) {
    this.lPrice = lPrice;
}

public double gethPrice() {
    return hPrice;
}

public void sethPrice(double hPrice) {
    this.hPrice = hPrice;
}

@Override
public String toString() {
    return "Item [lPrice=" + lPrice + ", hPrice=" + hPrice + "]";
}
}

驱动程序类

public static void main(String[] args) {

    List<Item> list = new ArrayList<>();
    list.add(new Item(1.0, 0.0));       list.add(new Item(3.0, 0.0));       list.add(new Item(4.0, 0.0));
    list.add(new Item(6.0, 0.0));       list.add(new Item(5.0, 0.0));       list.add(new Item(7.0, 0.0));

    System.out.println("Without Sorting...");
    list.forEach(System.out::println);

    list.sort(Comparator.comparingDouble(i -> ((Item) i).getlPrice()+((Item) i).gethPrice() ).reversed());
    System.out.println("\n=== in descending order===");
    System.out.println("===Sort based on sum of lower price and higher price of item===");
    list.forEach(System.out::println);

    list.clear();
    list.add(new Item(1.0, 0.0));       list.add(new Item(3.0, 0.0));       list.add(new Item(4.0, 0.0));
    list.add(new Item(6.0, 0.0));       list.add(new Item(5.0, 0.0));       list.add(new Item(7.0, 0.0));

    list = list.parallelStream().sorted(Comparator.comparingDouble(i -> ((Item) i).getlPrice()+((Item) i).gethPrice() ).reversed()).collect(Collectors.toList());
    System.out.println("\n=== Another Sol'n in descending order===");
    System.out.println("===Sort based on sum of lower price and higher price of item===");
    list.forEach(System.out::println);

    list.clear();
    list.add(new Item(1.0, 0.0));       list.add(new Item(3.0, 0.0));       list.add(new Item(4.0, 0.0));
    list.add(new Item(6.0, 0.0));       list.add(new Item(5.0, 0.0));       list.add(new Item(7.0, 0.0));


    list.sort((a1,a2) -> {
        double item1 = a1.getlPrice()+a1.gethPrice();
        double item2 = a2.getlPrice()+a2.gethPrice();
        return -Double.compare(item1, item2);
    });
    System.out.println("\n===Here is one more Solution===");
    list.forEach(System.out::println);
 }

输出。

未排序...

物品 [lPrice=1.0, hPrice=0.0]

物品 [lPrice=3.0, hPrice=0.0]

物品 [lPrice=4.0, hPrice=0.0]

物品 [lPrice=6.0, hPrice=0.0]

物品 [lPrice=5.0, hPrice=0.0]

物品 [lPrice=7.0, hPrice=0.0]

=== 按降序排列 ===

=== 基于物品下限价格和上限价格之和排序 ===

物品 [lPrice=7.0, hPrice=0.0]

物品 [lPrice=6.0, hPrice=0.0]

物品 [lPrice=5.0, hPrice=0.0]

物品 [lPrice=4.0, hPrice=0.0]

物品 [lPrice=3.0, hPrice=0.0]

物品 [lPrice=1.0, hPrice=0.0]

=== 另一种解决方案按降序排列 ===

===根据商品的最低价格和最高价格之和进行排序===

商品 [最低价格=7.0,最高价格=0.0]

商品 [最低价格=6.0,最高价格=0.0]

商品 [最低价格=5.0,最高价格=0.0]

商品 [最低价格=4.0,最高价格=0.0]

商品 [最低价格=3.0,最高价格=0.0]

商品 [最低价格=1.0,最高价格=0.0]

===这里还有一个解决方案===

商品 [最低价格=7.0,最高价格=0.0]

商品 [最低价格=6.0,最高价格=0.0]

商品 [最低价格=5.0,最高价格=0.0]

商品 [最低价格=4.0,最高价格=0.0]

商品 [最低价格=3.0,最高价格=0.0]

商品 [最低价格=1.0,最高价格=0.0]

这里是带有输出的完整程序图片


如果有任何错误,请告知并提供正确的解决方案,这样每个人都能受益。 - Harvansh Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接