You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决枚举随机值重复问题,生成唯一字符串数组

首先咱们来梳理下问题:你现在的getRandomColour方法每次都是直接从所有枚举值里随机挑,完全没考虑已经选过的,所以重复是必然的。要实现不重复的随机枚举值,核心思路就是跟踪已经使用过的颜色,或者直接对枚举列表做洗牌处理,确保每个值只出现一次。

下面给你几种实用的解决方案:

方案1:一次性生成指定数量的唯一随机颜色(最适合生成数组)

如果你需要直接生成一个包含N个不重复颜色的字符串数组,推荐用这种方法——先把所有枚举值放进列表,然后每次随机移除一个元素,直到拿到需要的数量:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

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

    // 静态方法:获取count个不重复的随机颜色
    public static List<Colour> getUniqueRandomColours(int count, Random rn) {
        // 先做参数校验,避免传入不合理的数量
        if (count < 0 || count > values().length) {
            throw new IllegalArgumentException("Count must be between 0 and " + values().length);
        }
        // 把所有枚举值放进可修改的列表
        List<Colour> remainingColours = new ArrayList<>(Arrays.asList(values()));
        List<Colour> selectedColours = new ArrayList<>();

        for (int i = 0; i < count; i++) {
            // 从剩余颜色里随机选一个索引
            int randomIndex = rn.nextInt(remainingColours.size());
            // 移除并添加到结果列表
            selectedColours.add(remainingColours.remove(randomIndex));
        }
        return selectedColours;
    }
}

使用示例(转成字符串数组):

Random rn = new Random();
// 比如要3个不重复的颜色
List<Colour> uniqueColours = Colour.getUniqueRandomColours(3, rn);
// 转换成字符串数组
String[] colourStrings = uniqueColours.stream()
                                      .map(Colour::name) // 把枚举转成对应的字符串
                                      .toArray(String[]::new);

方案2:逐个获取不重复的随机颜色(适合分批获取)

如果你需要每次调用获取一个不重复的颜色,直到所有颜色都用完,可以用一个集合来跟踪已选值:

import java.util.Random;
import java.util.Set;

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

    // 静态方法:传入跟踪已选颜色的集合,返回一个新的不重复颜色
    public static Colour getUniqueRandomColour(Random rn, Set<Colour> usedColours) {
        if (usedColours.size() == values().length) {
            throw new IllegalStateException("All colours have been used up!");
        }
        Colour selected;
        // 循环直到选到未使用的颜色
        do {
            selected = values()[rn.nextInt(values().length)];
        } while (usedColours.contains(selected));
        
        usedColours.add(selected);
        return selected;
    }
}

使用示例:

Random rn = new Random();
Set<Colour> used = new HashSet<>();

// 逐个获取
Colour first = Colour.getUniqueRandomColour(rn, used);
Colour second = Colour.getUniqueRandomColour(rn, used);
Colour third = Colour.getUniqueRandomColour(rn, used);

// 转成字符串数组
String[] colourArray = used.stream()
                           .map(Colour::name)
                           .toArray(String[]::new);

方案3:洗牌所有枚举值(适合需要全量随机排列)

如果你需要把所有枚举值都用上,只是要随机顺序,直接洗牌最省事:

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

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

使用示例:

Random rn = new Random();
List<Colour> shuffledColours = Arrays.asList(Colour.values());
Collections.shuffle(shuffledColours, rn);

// 转成字符串数组
String[] colourStrings = shuffledColours.stream()
                                        .map(Colour::name)
                                        .toArray(String[]::new);

这几种方法都能解决你遇到的重复问题,你可以根据自己的实际需求选最合适的~

内容的提问来源于stack exchange,提问作者Nick L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:38:36