我编写了一种从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");
}

09-04 23:33
查看更多