2

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

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

4 回答 4

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++;
    }
}
于 2013-08-06T09:11:40.710 回答
4

直接使用一个Random对象:

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

如果您需要灵活地处理不同类型的数组,您可以创建一个泛型方法,但您仍然不需要子类化Random

于 2013-08-06T09:13:52.967 回答
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;
        }
    }
于 2013-08-06T09:28:36.800 回答
3

由于 Random 类不是最终的 - 它是允许的

您可以查看一些子类: SecureRandomJVMRandomThreadLocalRandom

但在您的情况下,您可以使用Collections.shuffle()或按照 Ted Hopp 的建议进行操作。

于 2013-08-06T09:10:11.157 回答