从集合中挑选随机元素。它可以从Random类继承吗?

时间:2013-08-06 09:08:11

标签: java arrays random

我需要从给定的集合而不是数字生成随机单词的东西。

String[] words = {"this","is","an","example"};
while( true )
  System.out.println( random.nextFromArray(words) );

我可以从Random继承吗?是否允许从这个类继承?或者其他任何java.util.Something?

class RandomArray extends Random {
    public <T> T nextFromArray( T[] array ) {
        return array[ nextInt(array.length) ];
    }
 }; RandomArray random  = new RandomArray();

4 个答案:

答案 0 :(得分:4)

String[]转换为列表,以便Collections.shuffle可用于随机化列表的顺序。然后检索List<String>中的第一个元素。

public static void main(String[] args) {
    String[] words = {"this","is","an","example"};
    int x = 0;
    while(x < 2)
    {
        List<String> list = Arrays.asList(words);
        Collections.shuffle(list);
        System.out.println(list.get(0));
        x++;
    }
}

答案 1 :(得分:4)

直接使用Random对象:

Random rand = new Random();
String[] words = {"this","is","an","example"};
while (true) {
    System.out.println(words[rand.nextInt(words.length)]);
}

如果您需要灵活处理不同类型的数组,则可以创建泛型方法,但您仍然不需要继承Random

答案 2 :(得分:4)

  

我可以从Random继承吗?是否允许从这个类继承?

允许。但这不是正确的做法。

继承适用于您希望某些行为类似于您正在扩展的类的情况......以及更多内容。但是你(显然)不需要你的RandomArray类表现得像一个随机的数字生成器。你真正需要的是一个像这样的辅助方法:

     public static <T> T nextFromArray(Random random, T[] array) {
         return array[random.nextInt(array.length)];
     }

这样做有两个原因,而不是你的方式:

  • 这种方式允许您使用扩展Random的其他类型的随机数生成器。

  • 你的方式存在RandomArray完全用词不当的概念性问题。 RandomArray实例根本不是数组。相反,它是一个随机数生成器,带有一个额外的方法,用于从单独的数组中选择一个元素。

如果要设计一个真正的随机数组类,它看起来像这样:

    public class <T> RandomArray {
        private T[] array;
        private Random random;

        public RandomArray(Random random, T[] array) {
            this.random = random;
            this.array = array;
        }

        public T randomElement() {
            return array[random.nextInt(array.length)];
        }

        public T get(int index) {
            return array[index];
        }

        public void set(T value, int index) {
            array[index] = value;
        }
    }

答案 3 :(得分:3)

由于Random class不是final - 允许

您可以查看一些子类: SecureRandomJVMRandomThreadLocalRandom

但在你的情况下,你可以使用Collections.shuffle()或者使用Ted Hopp建议的内容。