【问题标题】:How can I find the biggest value in the response?如何在响应中找到最大的价值?
【发布时间】:2020-08-17 17:57:14
【问题描述】:

我有以下回复 我怎样才能通过它找到最大的卡等级? Card Rank 是 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))]

【问题讨论】:

标签: java algorithm kotlin collections enums


【解决方案1】:

你需要实现一个自定义的比较方法,然后结合分治算法来找到数组中的最大值。


比较

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(分而治之)

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;
    }
}

【讨论】:

  • 我找到了以下解决方案: val maxHand = hands.maxBy { it.firstCard.rank.ordinal }
【解决方案2】:

我用 maxBy 找到了以下解决方案{}

val maxHand = hands.maxBy { it.firstCard.rank.ordinal }

【讨论】:

    【解决方案3】:

    目标:找到拥有更大牌的获胜者。

    首先:定义数据结构,省略构造函数和getter/setter方法:

    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 为我们提供了很多简单的数据操作方法,你可以在here找到文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      相关资源
      最近更新 更多