怎么找到响应中的最大值?

huangapple 未分类评论60阅读模式
英文:

How can I find the biggest value in the response?

问题

我有以下的回应,如何遍历它以找到最大的卡牌等级?卡牌等级是枚举类型。目标:找到最大的卡牌,以确定游戏中谁获胜。

[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))]
英文:

I have the following response
how I can go throught it to find the biggest card Rank? Card Rank it is Enum
The goal: find the biggest card to know who wins in the game

[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))]

答案1

得分: 0

比较方法

public int compare(Card card1, Card card2) {
    if () {
        // card1 应该排在前面,返回负整数
    } else if () {
        // card2 应该排在前面,返回正整数
    } else {
        // card1 和 card2 排名相同,返回 0
    }
}

寻找最大值(分治法)

分治法的方法将通过在两个子数组中找到最大值,然后比较这两个最大值,来找到数组中的最大值。

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;
    }
}
英文:

You need to implement a custom compare method, and then combined it with a divide and conquer algorithm to find the maximum value in the array.


Compare

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 &amp; card2 rank the same, return 0
    }
}

findMax (Divid and conquer)

The Divide and conquer approach will find the maximum value, by finding the maximum value in two sub-arrays, and then comparing the two.

Card findMax(Card[] cards, int start, int end) {
    if (start &gt; end) return null; 
    else if (start == end) return cards[start]; 
    else if (start + 1 == end) {
        int c = compare(cards[start], cards[end]);
        return c &lt;= 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 &lt;= 0 ? m1 : m2;
    }
}

</details>



# 答案2
**得分**: 0

以下是翻译好的内容:

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

```kotlin
val maxHand = hands.maxBy { it.firstCard.rank.ordinal }
英文:

I found the following solution with maxBy{}

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

答案3

得分: 0

目标:找到手牌中有更大牌的赢家。

首先:定义数据结构,省略构造函数和获取/设置方法:

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流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()));

注:Java Stream为我们提供了许多简单的方法来操作数据,您可以从这里找到文档。

英文:

Goal: find the winner who has bigger card.

First: define Data structure,Omit constructor and getter/setter methods:

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;

Second: use Java 8 stream API to find the player we want(omit init codes):

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

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

ps:Java Strem provide many simple method for us to operate data,you can find docs from here

huangapple
  • 本文由 发表于 2020年5月3日 18:37:57
  • 转载请务必保留本文链接:https://java.coder-hub.com/61573064.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定