英文:
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 & 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 > 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;
}
}
</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<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 provide many simple method for us to operate data,you can find docs from here
专注分享java语言的经验与见解,让所有开发者获益!
评论