gpt4 book ai didi

Java 按两个 BigDecimal 之间的分布排序

转载 作者:行者123 更新时间:2023-12-05 09:00:38 25 4
gpt4 key购买 nike

请帮助在 Java 中进行排序。我有一个简单的例子(看起来像这样)。我需要根据两个 BigDecimals 之间的差异对列表进行排序。

我的数据类(我切 setter/getter )

    public class Quotation {
private final long id;
private final BigDecimal askPrice;
private final BigDecimal bidPrice;

public Quotation(long id, BigDecimal bidPrice, BigDecimal askPrice) {
this.id = id;
this.askPrice = askPrice;
this.bidPrice = bidPrice;
}
}

我们在这里存储我们的记录。

        storeQuotation(new Quotation(1000,new BigDecimal("99"), new BigDecimal("104")));
storeQuotation(new Quotation(1001,new BigDecimal("69"), new BigDecimal("72")));
storeQuotation(new Quotation(1002,new BigDecimal("65"), new BigDecimal("69")));
storeQuotation(new Quotation(1003,new BigDecimal("70"), new BigDecimal("71")));
storeQuotation(new Quotation(1004,new BigDecimal("71"), new BigDecimal("73")));
storeQuotation(new Quotation(1005,new BigDecimal("90"), new BigDecimal("95")));
storeQuotation(new Quotation(1006,new BigDecimal("92"), new BigDecimal("93")));
storeQuotation(new Quotation(1007,new BigDecimal("94"), new BigDecimal("98")));
storeQuotation(new Quotation(1008,new BigDecimal("90"), new BigDecimal("92")));
storeQuotation(new Quotation(1009,new BigDecimal("92"), new BigDecimal("95")));
out - Not Sorted
id - 1000. Bid - 99. Ask - 104. Spread = 5
id - 1001. Bid - 69. Ask - 72. Spread = 3
id - 1002. Bid - 65. Ask - 69. Spread = 4
id - 1003. Bid - 70. Ask - 71. Spread = 1
id - 1004. Bid - 71. Ask - 73. Spread = 2
id - 1005. Bid - 90. Ask - 95. Spread = 5
id - 1006. Bid - 92. Ask - 93. Spread = 1
id - 1007. Bid - 94. Ask - 98. Spread = 4
id - 1008. Bid - 90. Ask - 92. Spread = 2
id - 1009. Bid - 92. Ask - 95. Spread = 3

我只需要根据 bidPrice 和 askPrice 之间的差异对这个列表进行排序。我试过这个方法...

    public static List<Quotation> getSpreadsList(boolean decreasing) {
List<Quotation> sortedBySpread = QuotationsStoreImpl.quotationList;

Collections.sort(sortedBySpread, (a, b) ->
(a.getBidPrice().intValue() - b.getAskPrice().intValue()));

// sortedBySpread.sort((a, b) ->
// (a.getBidPrice().intValue() - b.getAskPrice().intValue()));

if (decreasing) {
Collections.reverse(sortedBySpread);
}
return sortedBySpread;
}
}

但是没有成功...

out - Sorted
id - 1002. Bid - 65. Ask - 69. Spread = 4
id - 1003. Bid - 70. Ask - 71. Spread = 1
id - 1004. Bid - 71. Ask - 73. Spread = 2
id - 1001. Bid - 69. Ask - 72. Spread = 3
id - 1008. Bid - 90. Ask - 92. Spread = 2
id - 1009. Bid - 92. Ask - 95. Spread = 3
id - 1006. Bid - 92. Ask - 93. Spread = 1
id - 1007. Bid - 94. Ask - 98. Spread = 4
id - 1005. Bid - 90. Ask - 95. Spread = 5
id - 1000. Bid - 99. Ask - 104. Spread = 5

列表是混合的,但没有按照我的标准排序!传播未排序!

我怎样才能按价差对这个列表进行正确排序?

我在 java 方面没有太多经验。而我所有的尝试都落空了。

最佳答案

Collections.sort(sortedBySpread, (a, b) -> (a.getBidPrice().intValue() - b.getAskPrice().intValue())); 做一些数学运算因为它从两个不同报价的出价中减去要价,所以收效甚微。

相反,您应该计算 a 的点差,然后减去 b 的点差:

Collections.sort(sortedBySpread, (a, b) -> (a.getBidPrice().intValue() - a.getAskPrice().intValue()) - (b.getBidPrice().intValue() - b.getAskPrice().intValue()));

通常这可以扩展为以下内容以更清楚地说明正在发生的事情:

Collections.sort(sortedBySpread, (Quotation a, Quotation b) -> {
int spreadA = a.getBidPrice().intValue() - a.getAskPrice().intValue();
int spreadB = b.getBidPrice().intValue() - b.getAskPrice().intValue();
return spreadA - spreadB;
});

但是从第一个片段开始,IntelliJ 提出了可以说是更简洁的解决方案

Collections.sort(sortedBySpread, Comparator.comparingInt(a -> (a.getBidPrice().intValue() - a.getAskPrice().intValue())));

从那里开始,在 Quotation 上有一个 getSpread 可能是有意义的:

public int getSpread() {
return bidPrice.intValue() - askPrice.intValue();
}

然后允许

Collections.sort(sortedBySpread, Comparator.comparingInt(Quotation::getSpread));

最后

sortedBySpread.sort(Comparator.comparingInt(Quotation::getSpread));

无需 Collections.sort

关于Java 按两个 BigDecimal 之间的分布排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75284279/

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