gpt4 book ai didi

java - 添加到数组列表功能上唯一的随机对象

转载 作者:行者123 更新时间:2023-11-30 06:16:55 26 4
gpt4 key购买 nike

public Hand dealHand(int endExclusive) {
List<Card> randomCardsCreated = IntStream.range(0, endExclusive).
mapToObj(i -> {
Card randomCard = generateRandomCard();

while (this.cardsDealt.contains(randomCard)) {
randomCard = generateRandomCard();
}
return randomCard;
}).
collect(Collectors.toList());

this.cardsDealt.addAll(randomCardsCreated);

return Hand.hand(randomCardsCreated);
}

我有这个方法,它生成一张随机卡并将其添加到字段列表(cardsDealt)中。它还确保 randomCard 不在列表中,如果在列表中,它将生成一张新的随机卡。然后,它将创建一个 x 张牌的列表以添加到 cardsDealt 中,然后它将创建一个新的 Hand 对象,其中将包含 cardsDealt。我认为这是不言自明的。

我想摆脱 randomCard 的可变性,而不是更改 randomCard 我想在功能上做到这一点,但到目前为止还没有成功。我还试图摆脱 while 循环并使用流。

任何建议都会有帮助。谢谢。

编辑

根据下面的评论,这里有一些更多信息。

这里还有一些关于如何使用上述内容的代码。

public List<PlayerResult> playGame(Player... players) {
List<Player> playersWithAHandOfCards = dealHandToAllPlayers(players);
...
}

private List<Player> dealHandToAllPlayers(Player[] players) {
return Arrays.stream(players).map(this::dealHand).collect(Collectors.toList());
}

private Player dealHand(Player player) {
Hand hand = deck.dealHand(5);
return player(player.playerName, hand);
}

代码位于我的 github https://github.com/hanfak/poker-game

编辑2:

我以程序格式重写了该方法,看起来不错,采纳了列出所有牌、洗牌并选择前 5 张牌作为手牌并将其从牌堆中删除的建议。

更多信息。 Rank 和 Suit 只是枚举,Card 类包含 Rank 和 Suit 的构造函数,以及重写的 equals 和 hashcode 方法。 Hand 和 Card 是使用静态工厂方法创建的。

private final List<Rank> ranks = Arrays.asList(Rank.values());
private final List<Suit> suits = Arrays.asList(Suit.values());
private List<Card> deck = createDeck();

public Hand dealHand(int endExclusive) {
Collections.shuffle(deck);

List<Card> dealtCards = getHand(endExclusive);

deck = deck.stream()
.filter(card -> !dealtCards.contains(card))
.collect(Collectors.toList());

return Hand.hand(dealtCards);
}

private List<Card> getHand(int endExclusive) {
if(deck.size() >= 5) {
return deck.subList(0, endExclusive);
} else {
throw new IllegalArgumentException("Not enough cards left over");
}
}

private List<Card> createDeck() {
List<Card> deck = new ArrayList<>();
for(Rank rank : ranks) {
for(Suit suit : suits) {
deck.add(Card.card(rank, suit));
}
}
return deck;
}

如果这可以变成一种函数式风格,我仍然会很感激,我不喜欢使用 Collections.shuffle(deck) 并且不能在“deck”字段中使用 Final。

最佳答案

如果您想使用函数式编程,那么您就快成功了 - 您只需要考虑一些小的更改。

  • 在您创建的流中,而不是运行 endExclusive使用 Stream.range 次,您只需 generate 怎么样?无限流和limitEndExclusive ?它是一个 int,它正是为其编写 limit 方法的类型。

  • 与其在 while 循环中运行来确保您的随机牌不在发牌中,不如使用 filter 怎么样?在流中本地执行此操作?

简而言之,我的代码建议是:

public Hand dealHand(int endExclusive) {
List<Card> randomCardsCreated = Stream.generate(()->generateRandomCard()).distinct().
filter(i->!cardsDealt.contains(i)).limit(endExclusive).
collect(Collectors.toList());

this.cardsDealt.addAll(randomCardsCreated);

return Hand.hand(randomCardsCreated);
}

Stream.generate(()->generateRandomCard()) - 生成无限的随机卡流。

distinct()过滤当前手牌中的任何重复牌(原始代码中未处理的问题)。

filter(i->!cardsDealt.contains(i))移除所有已经发出的牌。

limit(endExclusive)将结果限制为手牌中的endExclusive 卡牌。

这对您的实现有用吗?

关于java - 添加到数组列表功能上唯一的随机对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48973278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com