Как я могу интерпретировать сортировку в этом коде Java? - PullRequest
0 голосов
/ 03 апреля 2019

Мне бы очень хотелось получить помощь в интерпретации этого фрагмента кода.Как автор кода использовал сортировку?Результатом является обратная числовая сортировка.

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 ]

4 голосов
/ 03 апреля 2019

Это очень странный способ сравнения чисел, если не сказать больше.Ядро этого здесь:

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

Сравнение происходит путем:

  1. Сравнение предметов лексикографически, а не численно (String.format)
  2. Использование String s, представляющие только целочисленные значения (бит формата d)
  3. Заполнение этих целочисленных значений 0 s (бит формата 0) ...
  4. ...сформировать 8-значные целые числа (бит формата 8)
  5. После вычитания исходного значения в 999999999 (в предположении, что значение bid.getAmount() всегда будет меньше этого значения)

Вероятно, это может быть изменено на Comparator.comparingInt(your ToIntFunction here converting whatever bid.getAmount() returns).reversed().

1 голос
/ 03 апреля 2019

Чтобы дать вам похожий, но очень простой пример, чтобы прояснить, что происходит в вашем коде:

    List<Integer> list = Arrays.asList(1,3,5,6,2,7,9,8,4);
    list.sort(Comparator.comparing(i -> 10-i));
1 голос
/ 03 апреля 2019

Все сделано в этой строке:

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

Это очень странный способ выполнить обратную числовую сортировку, но он должен работать для чисел, которые не слишком велики (до тех пор, поканет целочисленного переполнения).По сути, числа сводятся к нулю (что эффективно меняет порядок), добавляются большие числа (что бесполезно и может вызвать переполнение) и преобразуются в строку (что также бесполезно).

Более обычным способом было быделать:

bidl.sort(Comparator.comparing(Bid::getAmount).reversed ());
0 голосов
/ 03 апреля 2019

Сортировка в этой строке:

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

Вычитает значение каждой ставки из очень большого числа (999999999), затем с Comparator.comparing проходит через каждый элемент списка и сравнивает их значение, затем сортирует их.

Результат в обратном порядке, потому что он вычитает ставку из очень высокого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...