Как я могу найти наибольшую ценность в ответе? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующий ответ, как я могу go через него найти самый большой ранг карты? Ранг карты - это Enum Цель: найти самую большую карту, чтобы узнать, кто победит в игре

[Hand(player=Player(name=Tesla, money=1300), firstCard=Card(rank=CARD_2, suit=DIAMOND), secondCard=Card(rank=CARD_5, suit=HEART)), Hand(player=Player(name=Uber, money=1500), firstCard=Card(rank=CARD_4, suit=SPADE), secondCard=Card(rank=CARD_4, suit=CLUB))]

Ответы [ 3 ]

0 голосов
/ 04 мая 2020

Я нашел следующее решение с maxBy {}

val maxHand = hands.maxBy { it.firstCard.rank.ordinal }
0 голосов
/ 04 мая 2020

Цель: найти победителя с более крупной картой.

Первый : определить структуру данных, методы конструктора Omit и методы получения / установки:

public class Card {
    private CardRank rank;
    private String suit;
}
public enum CardRank {
    CARD_2(2),
    CARD_4(4),
    CARD_5(5);

    private int val;

    public int getVal() {
        return val;
    }

    CardRank(int val) {
        this.val = val;
    }
}
public class Hand {
    private Player player;
    private Card firstCard;
    private Card secondCard;
}
public class Player {
    private String name;
    private int money;
}
public class PlayerWithBigCard {
    private String name;
    private CardRank rank;

Секунда: используйте Java 8 stream API, чтобы найти нужного игрока (пропустите коды инициализации):

Optional<PlayerWithBigCard> winner = hands.stream().map(hand -> {
    PlayerWithBigCard playerWithBigCard = new PlayerWithBigCard();
    playerWithBigCard.setName(hand.getPlayer().getName());
    CardRank firstCardRank = hand.getFirstCard().getRank();
    CardRank secondCardRank = hand.getSecondCard().getRank();
    if (firstCardRank.getVal() - secondCardRank.getVal() > 0) {
        playerWithBigCard.setRank(firstCardRank);
    } else {
        playerWithBigCard.setRank(secondCardRank);
    }
    return playerWithBigCard;
}).max(Comparator.comparingInt(p -> p.getRank().getVal()));

winner.ifPresent(playerWithBigCard -> System.out.println(playerWithBigCard.getName()));

ps : Java Strem предоставляет много простых методов обработки данных, вы можете найти документы по здесь

0 голосов
/ 04 мая 2020

Вам нужно реализовать собственный метод сравнения, а затем объединить его с алгоритмом «разделяй и властвуй», чтобы найти максимальное значение в массиве.


Сравнить

public int compare(Card card1, Card card2) {
    if () {
        // card1 should rank at the beginning, return a negative integer
    } else if () {
        // card2 should rank at the beginning, return a positive integer
    } else {
        // card1 & card2 rank the same, return 0
    }
}

findMax (Divid and conquer)

Подход Divide and conquer найдет максимальное значение, найдя максимальное значение в двух подмассивах, а затем сравнив их.

Card findMax(Card[] cards, int start, int end) {
    if (start > end) return null; 
    else if (start == end) return cards[start]; 
    else if (start + 1 == end) {
        int c = compare(cards[start], cards[end]);
        return c <= 0 ? cards[start] : cards[end];
    } else {
        int mid = start + (end - start) / 2; 
        Card m1 = findMax(cards, start, mid);
        Card m2 = findMax(cards, mid + 1, end);
        int c = compare(m1, m2);
        return c <= 0 ? m1 : m2;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...