如何解释此Java代码中的排序?

时间:2019-04-03 08:53:41

标签: java sorting arraylist

我真的很想得到一些帮助来解释这段代码。代码编写者如何使用排序?结果是反向数字排序。

private void listbids() {
    List<Bid> bidl;

    String dogName = readString("Dog name:");
    Auction bidAuction = null;
    for (Auction auctions : auctionsList) {
        if (auctions.getDogName().toLowerCase().equals(dogName.toLowerCase())) {
            bidAuction = auctions;
            break;
        }
    }
    if (bidAuction != null) {
        bidl = bidAuction.getBidding();
        bidl.sort(Comparator.comparing(bid -> String.format("%08d", 999999999-bid.getAmount())));
        System.out.println("Bids:");
        for (Bid bid : bidl) {
            System.out.println("Amount: " + bid.getAmount() + " Bidder: " + bid.getUser().getName());
        }
    } else {
        System.out.println("Error: No bids registred yet for this auction");
    }
}

4 个答案:

答案 0 :(得分:4)

至少可以说是比较数字的一种非常奇怪的方法。 它的核心在这里:

String.format("%08d", 999999999-bid.getAmount())

比较通过:

  1. 按字母顺序而不是数字(String.format)比较项目
  2. 使用String代表仅整数值(d格式位)
  3. 0 s(0格式位)填充这些整数值...
  4. ...形成8位整数(8格式位)
  5. 将原始值减去999999999后(假设bid.getAmount()值始终小于该值)

这可能可以用Comparator.comparingInt(your ToIntFunction here converting whatever bid.getAmount() returns).reversed()重构。

答案 1 :(得分:1)

一切都在这一行完成:

bidl.sort(Comparator.comparing(bid -> String.format("%08d", 999999999-bid.getAmount())));

这是进行反向数字排序的一种非常奇怪的方法,但是它应该适用于不太大的数字(只要没有整数溢出)。基本上,数字是取反的(有效地颠倒了顺序),添加了一个大数字(这是无用的并可能导致溢出),然后转换为字符串(这也是无用的)。

更常规的方法是:

bidl.sort(Comparator.comparing(Bid::getAmount).reversed ());

答案 2 :(得分:1)

为您提供类似但非常简单的示例,以澄清代码中发生的事情:

@param

答案 3 :(得分:0)

排序在这一行:

bidl.sort(Comparator.comparing(bid -> String.format("%08d", 999999999-bid.getAmount())));

它从一个非常高的数字(999999999)中减去每个出价的值,然后使用Comparator.comparing遍历列表的每个元素并比较它们的值,然后对它们进行排序。

结果是相反的,因为他从很高的数字中减去了出价。