Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ENUM从三个字符串中返回随机字符串?_Java_Random_Enums - Fatal编程技术网

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

Java 如何使用ENUM从三个字符串中返回随机字符串?,java,random,enums,Java,Random,Enums,通过使用下面的代码,我找到了我所在的数据中心,并且它工作正常 public enum DatacenterEnum { DEV, DC1, DC2, DC3; private static DatacenterEnum compareLocation() { String ourhost = getHostName(); for (DatacenterEnum dc : values()) { String namep

通过使用下面的代码,我找到了我所在的数据中心,并且它工作正常

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

ENUM
中是否有任何直接方式或单行命令可以让我随机返回
DC1
DC2
DC3
,而不是返回
null

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

任何我可以直接在枚举中使用的简单而直接的方法?

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

例如:

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之间的随机数:)

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

例如:

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之间的随机数:)

这是一行:

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

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

return new DataCenterEnum[]{DC1, DC2, DC3}[new Random().nextInt(3)];
这里有一句话:

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

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

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

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

单一排除的简便方法:

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, E exclude) {
    return getRandom(aEnum, Collections.singletonList(exclude));
}


哎呀,没有这样的办法。但如果我错了,我期待着对此的答案。您是否查看了
values()
返回的内容?然后考虑如何基于此选择合适的随机元素?你不需要创建一个字符串列表…在我的例子中,可能是重复的,我也有DEV,但我不需要选择随机的DEV,只有DC1,DC2,DC3.AFAIK,没有这样的方法。但如果我错了,我期待着对此的答案。您是否查看了
values()
返回的内容?然后考虑如何基于此选择合适的随机元素?你不需要创建一个字符串列表…在我的例子中,可能是重复的,我也有DEV,但我不需要选择只有随机性的DEV DC1,DC2,DC3。在我的例子中,我也有DEV,但我不需要选择只有随机性的DEV DC1,DC2,DC3。你能提供一个例子吗?创建一个介于1和3之间的随机值,而不是0和3之间的随机值怎么样?@AKIWEB-请参阅我上面使用构造函数和随机值的解决方案。我想这是我们能用enum做的最干净的了!在我的例子中,我也有DEV,但我不需要选择随机性只有DC1、DC2、DC3的DEV。你能提供一个例子吗?创建一个介于1和3之间的随机值,而不是0和3之间的随机值怎么样?@AKIWEB-请参阅我上面使用构造函数和随机值的解决方案。我想这是我们能用enum做的最干净的了!被否决,因为这取决于忽略
DEV
@EvertonAgner的元素顺序,所以,你认为这个答案没有用吗?你应该振作起来。代码行和它所依赖的枚举实例在同一个类中。这使得它完全安全并且是“最佳实践”;任何代码丑陋都是自包含的,只影响类本身——一个实现细节。任何更改枚举顺序的人都必须修复随机选择器,这很简单,顺便说一句,现在它非常简单,因为它们是有序的,但是任何组合都可以使用简单的数学来处理序列中的间隙,这很可能永远不会发生。我刚才解释了我的反对票。这是普通的礼貌。@EvertonAgner是的,就是这样。为了你,我添加了一个“安全”版本。@EvertonAgner-hmmmm。。。我必须做更多的研究来研究我经常听到的“玩得很好”的事情:)被否决,因为这取决于忽略
DEV
@EvertonAgner的元素顺序,所以,你认为这个答案没有用吗?你应该振作起来。代码行和它所依赖的枚举实例在同一个类中。这使得它完全安全并且是“最佳实践”;任何代码丑陋都是自包含的,只影响类本身——一个实现细节。任何更改枚举顺序的人都必须修复随机选择器,这很简单,顺便说一句,现在它非常简单,因为它们是有序的,但是任何组合都可以使用简单的数学来处理序列中的间隙,这很可能永远不会发生。我刚才解释了我的反对票。这是普通的礼貌。@EvertonAgner是的,就是这样。为了你,我添加了一个“安全”版本。@EvertonAgner-hmmmm。。。我必须对这个我耳熟能详的“玩得不错”的东西做更多的研究:)你也可以使用varargs而不是list getRandom(类aEnum,E…exclude),只需将removeAll行改为enums.removeAll(Arrays.asList(exclude));您也可以使用varargs代替list getRandom(类aEnum,E…exclude),只需将removeAll行更改为enums.removeAll(Arrays.asList(exclude));