【问题标题】:How can i pick Random Value from an Enum?我如何从枚举中选择随机值?
【发布时间】:2020-09-10 16:35:27
【问题描述】:

我想了解如何从枚举中选择一个字符串值并在 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();

    }

你能告诉我哪里错了吗?如何改正?

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

【问题讨论】:

    标签: java arrays loops random enums


    【解决方案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 开始。在该循环中,您为从 0 开始的动物数组的每个索引分配一个值。所以 animals[0] = random animal; 您可以在代码中看到这是如何发生的,并且在您执行此操作之后,您返回数组并且调用该方法的代码现在可以访问该数组的值。 这意味着这意味着 main 方法中的变量 Animals[] zoo 现在保存了生成的数组。然后这段代码打印该数组中的所有元素。

    浏览它几次并尝试修改它。让它只打印在 Animals 枚举中甚至 indeces 上的动物或类似的东西。 祝你好运

    【讨论】:

    • 每次调用values()都会返回一个新克隆的数组,它应该在循环外声明。同样来自 Java 1.7 或更高版本的ThreadLocalRandom 是为此类示例生成随机数的标准方法。
    • 好的,谢谢。将对其进行编辑。我猜我太匆忙写代码了。
    【解决方案2】:

    要生成随机数,请使用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;
        }
    }
    

    【讨论】:

    • 这是作业中要求的。我很感激。:)
    【解决方案3】:
    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 2019-03-20
      • 2013-10-20
      • 2016-05-18
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多