我需要从给定的集合而不是数字生成随机单词的东西。
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();
答案 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 - 允许
您可以查看一些子类: SecureRandom,JVMRandom和ThreadLocalRandom
但在你的情况下,你可以使用Collections.shuffle()或者使用Ted Hopp建议的内容。