我编写了一种从Map
获取随机值的方法。我首先获取了地图中的所有值,并使用Random
对象获取了一个随机值。方法如下:
public static <K, V> V getRandomValInMap (Map<K, V> map) {
Collection<V> values = map.values ();
V[] array = (V[])values.toArray ();
return array[random.nextInt (array.length)];
}
在表达中
(V[])values.toArray ()
Android Studio表示这是“从
Object[]
到V[]
的未经检查的转换”。所以我想这有点“危险”。我尝试使用toArray
的另一个重载:V[] array = new V[values.size()];
array = values.toArray (array);
而且我想这不是您将如何使用重载的方法,因为有一个编译器错误称我无法初始化
V
。所以我认为也许我应该使用第一种方法。但是,如何“检查”演员表以取消警告?
或者,您可以告诉我如何正确使用
toArray(T[] array)
重载。 最佳答案
更好的方法是根本不创建新数组:
public static <K, V> V getRandomValInMap (Map<K, V> map) {
Collection<V> values = map.values ();
Iterator<V> it = values.iterator();
int choosen = new Random().nextInt (values.size());
for (int i=0; i<values.size();i++) {
V value = it.next();
if (i==choosen) return value;
}
throw new AssertionError("Choosen value out of bounds");
}