【问题标题】:Picking a random element from an arraylist and removing it from the list in Java从数组列表中选择一个随机元素并将其从 Java 列表中删除
【发布时间】:2018-10-20 04:11:16
【问题描述】:

我正在开发一个命令行类型的程序,可以让你玩纸牌。我目前有class Deckclass Card。 在类 Deck 中,我有一个 ArrayList 和两种方法 - 一种用于创建甲板,另一种用于对其进行洗牌。我需要创建一个处理卡片的方法——这意味着一种从 ArrayList 中选择随机元素并将其从 ArrayList 中删除的方法。我相信,当发牌时,它不再在 ArrayList 中了。这是我的 Deck 类中的代码:

public class Deck {
   private ArrayList deck = new ArrayList < Card > ();
   private Random randomGenerator;

}

public Deck() {
 for (Suit s: Suit.values())
  for (Numbers n: Numbers.values()) {
   Card c1 = new Card(n, s);
   deck.add(c1);
   System.out.println(deck);
  }
}
private void printAll() {}
public void shuffle() {
 Collections.shuffle(deck);
}

我真的很难创建一种方法来删除处理的元素,到目前为止我所做的几乎都是基于这个问题的答案,但这并不是我所需要的。 Retrieving a random item from ArrayList

public Card deal(deck) {
    Random rand = new Random();
    Card dealtCard = rand.deck();
    return dealtCard;
}

任何人都可以为我提供有关此方法的任何指导吗? 请和谢谢你

【问题讨论】:

  • deck.remove(ThreadLocalRandom.current().nextInt(deck.size()));
  • 我认为更好的办法是使用Collections.shuffle(),然后每次只从顶部或底部发一张牌。 docs.oracle.com/javase/9/docs/api/java/util/…
  • 一个好的起点是查看 ArrayList 的 javadocs
  • 我确实重新格式化了代码,对不起
  • @CatV 不是。同样基于此代码,您的类Deck 在花括号的定位方面不正确

标签: java


【解决方案1】:

实际上,洗牌的全部意义在于让您从牌组顶部进行发牌并每次都获得随机牌。所以如果Deck 类有:

private final List<Card> cards = new ArrayList<>();

而你已经调用了Collections.shuffle(cards),那么你需要做的就是获得牌库中的第一张牌:

public Card deal() {
    return cards.remove(0);
}

您还应该有一个isEmpty 方法,以便调用者在调用deal 之前可以确保牌堆中还有卡片。这比抓IndexOutOfBoundsException 更好的编码实践。

【讨论】:

  • @CatV — 还要注意正确的声明:List&lt;Card&gt; cards = new ArrayList&lt;&gt;(); ...cards 是 List 并且 List 的选择实现是 ArrayList - 但代码不应该关心关于那个选择,所以你只需声明List&lt;Card&gt;
【解决方案2】:

你可以使用这样的东西

Random rand = new Random();

int randomElement = givenList.get(rand.nextInt(givenList.size()));

我认为这个链接可能有用 http://www.baeldung.com/java-random-list-element

【讨论】:

  • 这不会移除卡片,因此可以多次发同一张卡片。请参阅您链接到的文章中的 2.4 “选择没有重复的随机项目”
猜你喜欢
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2017-05-11
  • 2014-02-07
  • 2011-05-29
  • 2012-01-12
  • 2017-12-06
  • 2013-10-19
相关资源
最近更新 更多