如何从枚举类型中随机选取一个值?

3

我想学习如何从枚举中选择一个字符串值并在for-each循环中运行。

让我在这里写下任务:

“编写一个静态方法 generateRandomZoo(n)。

该方法应具有 int n 参数,结果应为长度为 n 的动物数组,其中包含随机选择的动物。

操作如下:

  • 首先创建一个相应长度的空数组。
  • 循环遍历数组。
  • 使用静态方法 RandomTools.randomValue 在每次运行时生成介于 0 到 Animal.values().length(不包括)之间的随机值 r。
  • 将枚举元素 Animal.values() [r] 的对应序号分配给当前数组位置的枚举元素。您可以假设 n 为正数。”

我的实现如下:

首先枚举类如下:

package main;

public enum Animal{

    ELEPHANT,LION, TIGER, WASP, SNAKE,MONKEY,  EMU;

}

主要的编码部分如下:

public static void main(String[] args) {

    Animal[] zoo = generateRandomZoo(100);
}

private static Animal[] generateRandomZoo() {
    // TODO Auto-generated method stub

    Animal [] animals= new Animal [100];
    for(Animal a : Animal.values()){
        System.out.println("Random Animals"+ "-" + a + "-" +(a.ordinal()+1));

        for (int i = 0; i < 100; i++) {
            animal[i] = random animal
            System.out.println(i);
        }

        private static   RandomTools.randomValue();

    }

请告诉我我的错误在哪里以及如何进行纠正?

(顺便说一句,我是个初学者,请用我能理解的方式描述)

3个回答

1
为了生成随机数,使用 ThreadLocalRandom.current().nextInt(0, Animal.values().length) 并使用 Animal.values()[randomNumber] 从枚举中检索值,尽管似乎你已经提供了 RandomTools.randomValue。我为了完整性而编写了自己的代码。

在循环之外声明 Animal[] values = Animal.values(),并在该数组上执行操作,以避免多次调用 values()

它应该看起来像这样:

import java.util.concurrent.ThreadLocalRandom;

public class SOExample {
    private enum Animal {
        ELEPHANT, LION, TIGER, WASP, SNAKE, MONKEY, EMU
    }

    // It's not clear from the question if you're provided with this or if you have to write it
    private static class RandomTools {
        public static int randomValue(int start, int end) {
            return ThreadLocalRandom.current().nextInt(start, end);
        }
    }

    public static void main(String[] args) {
        Animal[] zoo = generateRandomZoo(100);
        // Printing to STDOUT to check results
        for (int i = 0; i < zoo.length; i++) {
            System.out.println(zoo[i]);
        }
    }

    private static Animal[] generateRandomZoo(int numberOfAnimals) {
        Animal[] animals = new Animal[numberOfAnimals];
        Animal[] values = Animal.values();
        for (int i = 0; i < animals.length; i++) {
            int random = RandomTools.randomValue(0, values.length);
            animals[i] = values[random];
        }
        return animals;
    }
}

这是作业中要求的内容。我很感激。:) - Rohirrim Charge

1
enum Animal {
    ELEPHANT, LION, TIGER, WASP, SNAKE, MONKEY, EMU
}

Animal[] generateRandomZoo(int n) {

    // possible animal values from enum Animal
    // This array will be of size 7.
    // It has values - ELEPHANT, LION, TIGER, WASP, SNAKE, MONKEY, EMU
    Animal[] animalsOptions = Animal.values();

    // Will be used to generate Random values
    Random random = new Random();

    // Array of size n to store animals to be generated
    Animal[] animals = new Animal[n];

    for (int i = 0; i < n; i++) {

        // animalsOptions.length = 7
        // index will have random value between 0 to 6
        int index = random.nextInt(animalsOptions.length);

        // we take a random animal from animalsOptions and store it in animals
        animals[i] = animalsOptions[index];
    }

    return animals;
}

然后您可以调用此方法获取所有随机动物。
Animal[] animals = generateRandomZoo(100);
for (Animal animal: animals) {
    System.out.println(animal);
}

1

我会给你整个代码,但请确保仔细阅读并理解其中发生的事情。

    public static void main(String[] args) {
    Instant start = Instant.now();
    Main m = new Main();
    m.main();
    Instant finish = Instant.now();
    long timeElapsed = Duration.between(start, finish).toMillis();
    System.out.println();
    System.out.println(timeElapsed / 1000.0 + " seconds!");
}


public enum Animal {

    ELEPHANT, LION, TIGER, WASP, SNAKE, MONKEY, EMU;

}

public void main() {
    Animal[] zoo = generateRandomZoo(5); // gets the array
    Arrays.stream(zoo).forEach(System.out::println); // prints the array using the java8 Stream API.
}

private static Animal[] generateRandomZoo(int numAnimals) {
    Animal[] animals = new Animal[numAnimals]; // the array that you want to return
    int size = Animal.values().length; // number of different animals
    Animal[] differentAnimals = Animal.values();
    for (int i = 0; i < numAnimals; i++) {// going through the array of size numAnimals, which is the method
                                          // parameter
        animals[i] = differentAnimals[RandomTools.randomValue(size)];// you get the random value between 0 and number
                                                                    // of different animals and you get that animal.
                                                                    // Then you put it in the array of animals
    }
    return animals;// this is where you return your array.
}

static class RandomTools {
    public static int randomValue(int size) {
        return ThreadLocalRandom.current().nextInt(0, size);
    }
}

所以这段代码调用了你想要创建的函数。该函数的作用是接收一个数字(在本例中为numAnimals = 5),并使用它来创建大小为numAnimals的数组。 下一步是填充数组。您可以使用for循环,从0到numAnimals进行迭代,因为数组从0开始。在该循环中,您将为每个animals数组的索引分配一个值,从0开始。因此,animals [0] = 随机动物; 您可以在代码中看到它的发生方式,在执行完后,返回该数组,调用该方法的代码现在可以访问该数组的值。 这意味着主方法中的变量Animals[] zoo现在持有生成的数组。然后,此代码打印该数组中的所有元素。
多读几遍并尝试修改它。使其仅打印Animals枚举中位于偶数索引上的动物或类似内容。 祝你好运

每次调用values()都会返回一个新克隆的数组,应该在循环外声明。另外,从Java 1.7或更高版本开始,ThreadLocalRandom是生成此类示例的随机数的标准方式。 - Robert Bain
好的,谢谢。我会进行编辑的。我想我写代码时有些着急了。 - Ivan Dimitrov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接