Компаратор внутри отсортированного метода Stream - PullRequest
0 голосов
/ 12 октября 2018

Он не сортируется должным образом, на самом деле он вообще не сортируется, и я не знаю, почему

это класс Comparator:

public class Komparator implements Comparator<BoardGame> {

    @Override
    public int compare(BoardGame o1, BoardGame o2) {
        System.out.println(o1.rating+"-"+o2.rating);
        return (int) (o2.rating-o1.rating);
    }
}

это основная часть

List<BoardGame> games = Arrays.asList(
                new BoardGame("Terraforming Mars", 8.38, new BigDecimal("123.49"), 1, 5),
                new BoardGame("Codenames", 7.82, new BigDecimal("64.95"), 2, 8),
                new BoardGame("Puerto Rico", 8.07, new BigDecimal("149.99"), 2, 5),
                new BoardGame("Terra Mystica", 8.26, new BigDecimal("252.99"), 2, 5),
                new BoardGame("Scythe", 8.3, new BigDecimal("314.95"), 1, 5),
                new BoardGame("Power Grid", 7.92, new BigDecimal("145"), 2, 6),
                new BoardGame("7 Wonders Duel", 8.15, new BigDecimal("109.95"), 2, 2),
                new BoardGame("Dominion: Intrigue", 7.77, new BigDecimal("159.95"), 2, 4),
                new BoardGame("Patchwork", 7.77, new BigDecimal("75"), 2, 2),
                new BoardGame("The Castles of Burgundy", 8.12, new BigDecimal("129.95"), 2, 4)
        );

games.stream().filter(g->g.name.contains("a")).
                sorted(new Komparator()).
                map(g->g.name).forEach(System.out::println);

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Как @khelwood упомянул преобразование в int, как (int) просто усекает десятичную часть.Поэтому вам лучше сменить компаратор на следующее:

public class Komparator implements Comparator<BoardGame> {

  @Override
  public int compare(BoardGame o1, BoardGame o2) {
    System.out.println(o1.rating+"-"+o2.rating);
    if (o2.rating > o1.rating) return 1;
    if (o2.rating == o1.rating) return 0;
    return -1;
  }
}

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

0 голосов
/ 12 октября 2018

Было бы намного проще (и меньше подвержено ошибкам), если бы вы написали это как:

games.stream()
     .filter(g->g.name.contains("a"))
     .sorted(Comparator.comparingDouble(BoardGame::getRating))
     ....

Если вы все еще хотите использовать свой компаратор, используйте его с правильным методом, таким как Double::compare

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