如何从枚举中提取元素而不重复

时间:2018-03-21 11:05:16

标签: java enums

我一直在尝试从枚举中提取值并将它们存储为数组中的String。但是,根据变量,值必须是唯一的,即相同的值不能使用两次。

我使用以下代码来提取值:

public enum Colour
{
    ROOD, GEEL, GROEN, BLAUW, PAARS;

    public Colour getRandomColour(Random rn)
    {
        return values()[rn.nextInt(values().length)];
    }
}

但是,这可以提供重复值。

似乎我的枚举值拒绝放在代码块中。遗憾!

编辑:

for (int i = 0; i < code.length; i++) 
            code[i] = kleur.getRandomColour(rn).toString();

它填满了数组'代码'。数组长度取决于几个因素,但它总是小于或等于枚举中的值。

3 个答案:

答案 0 :(得分:1)

您可以使用Colour enum,shuffle中的所有值填充列表,然后按顺序访问值:

List<Colour> colourList = Arrays.asList(Colour.values());
Collections.shuffle(colourList);

然后,只需迭代列表并按顺序访问颜色,当然这应该是随机的,因为集合是洗牌的:

for (Colour c : colourList) {
    // do something with c
}

您也可以使用当前的方法,并将颜色存储到一个集合中,而不是存储在ArrayList中。但问题是你可能会多次绘制重复值,并且随着集合大小增加而发生的可能性会增加。

答案 1 :(得分:0)

使用临时列表检查新值是否已存在并继续生成新值,直到找到唯一值。

for (int i = 0; i < code.length; i++) {
   String next = kleur.getRandomColour(rn).toString();
   List<String> tempList = Arrays.arrayAsList(code);
   while (tempList.contains(next);
     next = kleur.getRandomColour(rn).toString();
   }
   code[i] = next;
}

答案 2 :(得分:0)

对于那些仍在疑惑的人,我可能找到了一个很好的解决方案。 将数组的值存储在ArrayList中。使用for循环从ArrayList中提取值,然后删除该索引,从根本上消除重复。