选择稀有商品-Java

时间:2019-01-12 09:04:42

标签: java class random plugins

我有一个关于选择具有指定稀有性的物品的问题。

我有一个“卡”类

class Card {
    String name;
    int seltenheit;
    ArrayList<String> lore;
    String full_id;
    int id_int;
    byte id_byte;

    Card(String name, int seltenheit, ArrayList<String> lore, String id) {
        this.name = name;
        this.lore = lore;
        this.full_id = id;
        this.id_int = (id.contains(":")) ? Integer.parseInt(id.substring(0, id.indexOf(":")))
                : Integer.parseInt(id);
        this.id_byte = (id.contains(":"))
                ? Byte.parseByte(id.substring(id.indexOf(":") + 1, id.length()))
                : 0;
        this.seltenheit = seltenheit;
    }
}

并且我创建了一个包含一些卡的ArrayList,并且每个卡在该类中都有其自己的“稀有性”,因为我来自奥地利,所以被称为“ Seltenheit”。

我想从此ArrayList中以指定的稀有度选择5个项目。 稀有度介于1到100之间,100表示​​非常普遍,1表示非常罕见,依此类推。所以我需要一个函数,它会随机选择5个稀有项。

对不起,我的英语不好:P 我希望有人能帮助我。 谢谢。

3 个答案:

答案 0 :(得分:0)

  1. 从ArrayList中选择所有具有选定稀有度的卡到单独的集合中。

  2. 从单独的收藏集中选择五张随机卡片。

如果需要,这种通用方法也适用于具有一定稀有度值的卡。

您需要处理少于五张稀有卡片的情况。您可能想让单独的收藏夹保留卡片的引用,而不是复制整个卡片。

答案 1 :(得分:0)

可能是一个老问题:Randomly selecting an element from a weighted list

答案是将所有稀有物加在一起,然后放入二叉搜索树中。

您只需要根据随机(1,sum_of_rarity)选择一个节点即可。

(有关其他说明,请参见其他答案)

答案 2 :(得分:0)

您还可以执行以下操作:

  1. 过滤具有特定稀有度的卡片阵列列表
  2. 随机播放数组列表
  3. 获取arraylist的前5张(如果列表中没有5个元素,则为更低)

由于混洗,复杂度为O(n)source),其中n是具有特殊稀有性的纸牌数量。这可能是O(log n) if use a tree structure或类似名称。这将需要与列表不同的结构,而列表可能不是您想要的。但是,如果复杂性不是问题(也许是因为没有多少张具有特定稀有性的卡片),那么这段代码将简短易行:

public ArrayList<Card> selectRandomItems(ArrayList<Card> cards, int rarity, int maxItems) {
    // Get all cards with the given rarity
    ArrayList<Card> selected = cards.stream()
            .filter(card -> card.seltenheit == rarity)
            .collect(Collectors.toCollection(ArrayList::new));

    // Shuffle the collection to get random items
    Collections.shuffle(selected);

    // Get the maximum index without going out of bounds, given the maximum amount of items
    int maxIndex = (selected.size() < maxItems) ? selected.size(): maxItems;

    return new ArrayList<>(selected.subList(0, maxIndex));
}