如何使用ENUM从三个中返回随机字符串?

时间:2014-01-16 23:18:11

标签: java random enums

使用下面的代码,我发现我在哪个数据中心并且工作正常..

public enum DatacenterEnum {

    DEV, DC1, DC2, DC3;

    private static DatacenterEnum compareLocation() {
        String ourhost = getHostName();

        for (DatacenterEnum dc : values()) {
            String namepart = "." + dc.name().toLowerCase() + ".";
            if (ourhost.indexOf(namepart) >= 0) {
            return dc;
            }
        }
        return null;// I don't want to do this now.
    }
}

但它可能无法找到任何数据中心,所以目前我正在返回null

是否有任何直接方式或单行命令可以随机返回DC1中的DC2DC3ENUM,而不是返回{{1 }}?

我知道一种方法是创建一个字符串列表,然后随机选择0到2之间的任何整数,然后找到字符串。但它代码太多了,实际上它不是,只是试图看看有没有其他方法可以做到这一点?

我可以直接在ENUM中使用任何简单直接的方法吗?

3 个答案:

答案 0 :(得分:3)

这是一行:

return DataCenterEnum.values()[new Random().nextInt(3) + 1)];

对于那些需要更严格控制代码的人来说,这是一个更安全的版本,它不依赖于枚举实例的顺序:

return new DataCenterEnum[]{DC1, DC2, DC3}[new Random().nextInt(3)];

答案 1 :(得分:1)

这是一个适用于任何枚举的通用解决方案。

单一排除的便捷方法:

public static <E extends Enum<E>> E getRandom(Class<E> aEnum, E exclude) {
    return getRandom(aEnum, Collections.singletonList(exclude));
}

使用一个或多个排除项的通用方法:

public static <E extends Enum<E>> E getRandom(Class<E> aEnum, List<E> exclude){
    //Convert set of enums into a list
    List<E> enums = new ArrayList<E>(EnumSet.allOf(aEnum));

    //Remove items from the list that you want to exclude
    enums.removeAll(exclude);

    int size = enums.size();
    if(size != 0){
        //Get random enum
        int randomIndex = new Random().nextInt(size);
        return enums.get(randomIndex);
    } else {
        throw new IllegalArgumentException("Empty Enumeration after excludes");
    }
}

您可以致电

EnumUtil.getRandom(DatacenterEnum.class, DatacenterEnum.DEV);

答案 2 :(得分:0)

您可以使用values()方法,该方法返回一个数组。然后使用Math.random()返回一个随机实例。

Here就是一个例子:

public static void main (String[] args) {
    String[] arr = {"DEV","DC1","DC2","DC3"}; //returned by Enum.values(), you get the idea
    String randElement = arr[(int) ((Math.random() * 3) +1)]; 
    System.out.println(randElement);
}

基本上它归结为生成1到n之间的随机数:)