当前位置: 首页 > 知识库问答 >
问题:

重复数组中的值并进行洗牌

刁文光
2023-03-14

我在Java中洗牌二维数组时遇到问题。有10张底牌。

这是阵列:

String[][] Cards = new String[][] {
        {"CardType1","CardName1","CardProperties"},
        {"CardType1","CardName2","CardProperties"},
        {"CardType1","CardName3","CardProperties"},
        {"CardType2","CardName4","CardProperties"},
        {"CardType2","CardName5","CardProperties"},
        {"CardType2","CardName6","CardProperties"},
        {"CardType2","CardName7","CardProperties"},
        {"CardType3","CardName8","CardProperties"},
        {"CardType3","CardName9","CardProperties"},
        {"CardType3","CardName10","CardProperties"}
        };

每张牌必须复制4次,才能完成一副40张牌的牌组,然后洗牌。如何使用Java来实现这一点?

共有1个答案

汪弘光
2023-03-14

首先,你有点物体恐惧症。让我们从卡片类型的枚举开始:

public enum CardType {
    TYPE_1,
    TYPE_2,
    TYPE_3,
    //etc...
    ;
}

不确定卡片名称是什么,但让我们把它作为一个String。也不确定卡片属性是什么——让我们称之为地图

public class Card {
    private final CardType cardType;
    private final String cardName;
    private final Map<String, String> properties = new HashMap<>();

    Card(final CardType cardType, final String cardName) {
        this.cardType = cardType;
        this.cardName = cardName;
    }

    public Card setProperty(final String name, final String value) {
        properties.put(name, value);
        return this;
    }

    public String getProperty(final String name) {
        return properties.get(name);
    }
}

添加getter和setter,以及toStringequalshashCode方法。可能使实现可比性

所以要创建一个Card,您可以调用:

final Card card = new Card(CardType.TYPE_1, "CardName1");

要设置属性,因为该方法是可链接的,所以可以执行以下操作:

final Card card = new Card(CardType.TYPE_1, "CardName1").
        setProperty("prop1", "thing").
        setProperty("prop2", "stuff");

现在,要创建牌组,每种类型需要4张牌,这很简单。使用Java 8:

final List<Card> deck = Stream.of(CardType.values()).
        flatMap(type -> IntStream.rangeClosed(1, 4).mapToObj(num -> new Card(type, "CardName" + num))).
        collect(toList());

Java 8之前版本要创建列表,可以使用显式循环:

final List<Card> deck = new LinkedList<>();
for (final CardType cardType : CardType.values()) {
    for (int i = 1; i <= 4; ++i) {
        final Card card = new Card(cardType, "CardName" + i);
        deck.add(card);
    }
}

要洗牌集合,只需使用集合即可。洗牌像这样:

Collections.shuffle(deck);

 类似资料:
  • 问题内容: 如何在Swift中随机或随机排列数组中的元素?例如,如果我的阵列由52张扑克牌,我想 洗牌 的阵列,以洗牌。 问题答案: 该答案详细说明了如何在Swift 4.2+中使用快速统一的算法(Fisher- Yates)进行改组,以及如何在各个早期版本的Swift中添加相同功能。每个Swift版本的命名和行为都与该版本的变异和非变异排序方法匹配。 并且是从Swift 4.2开始原生的 用法示

  • 我有一个名为$PRODUCTS_LIST的数组,它填充了数据,结构如下: 如果数组中的值具有相同的描述和条件,我正在尝试从数组中删除任何重复值,并合并重复值中的数量。 我尝试将数据设置为临时数组,以便能够将两个数组比较为foreach语句。类似这样的事情:

  • 问题内容: 假设我有一个数组 如何(有效地,以Python方式)找到重复的元素(即非唯一值)?在这种情况下,结果将是有效的,或者可能是有效的。 我想出了一些可行的方法: 掩蔽 设定操作 这个很可爱,但可能是非法的(实际上并不是唯一的): 直方图 排序 大熊猫 有什么我想念的吗?我不一定要寻找仅numpy的解决方案,但它必须与numpy数据类型一起使用,并且必须在中等大小的数据集(最大1000万个大

  • 问题内容: 我有以下数组: 结果: 现在如何显示具有重复值的键?在此函数不应返回([0],[9]),因为没有重复的值。 如何找到相同值的键,例如 对于“ 2011-06-25”,应返回[7],[8] 问题答案: 函数名称显然很长;) 现在$ dups将包含一个由重复值键控的多维数组,其中包含每个重复项的键,如果您将“ true”作为第二个参数发送,它将返回没有重复值的原始数组。 或者,您可以将原始

  • 我试图解开这个xml片段 但是尽管我采取了行动,结果总是几乎相同的(4个或2个空字段): 我以前的操作是:定义构造函数(所有字段,没有字段),添加setter和getter,并将其标记为@xmlement。对具有属性顺序的子类使用@XmlType。还尝试使用包信息和ObjectFactory。我从Stack Overflow的示例中尝试过的当前版本:由于所有字段的名称都是匹配的xml字段,因此只能

  • 在mongodb中,我有一个集合,其中数组有重复的条目,如 我需要删除重复的数组,只保留唯一的数组值,如下所示。 最好的方法是什么 谢啦