如何从 Dart 中的 Map 中选择随机元素?

ts.*_*ts. 2 dart

如何从Map中选择随机键(元素)?

我可以使用map.keys.toList()来做到这一点,如下面的代码所示,但我想知道是否有更直接的方法?

import "dart:math";

void main() {
    var map = {'a' :1, 'b':2, 'c':3};
    final _random = new Random();
    var keys = map.keys.toList();
    var element = keys[_random.nextInt(keys.length)];
    var r = map[element];
    print(r);
}
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 5

没有简单的方法可以从地图中选择“随机”键。我假设这里的“随机”意味着在地图的键中均匀随机地选取它。

为此,您需要在范围内选择一个随机数0...... map.length - 1然后你需要获取对应的key。由于Map.key是一个可迭代对象,因此您不能假设可以在其中进行常量时间查找,但您可以使用它elementAt来获取特定的可迭代项,而无需创建新列表。

所以,基本上:

randomKey(Map map) =>
    map.keys.elementAt(new Random().nextInt(map.length));
Run Code Online (Sandbox Code Playgroud)

(就像你这样做,但没有toList)。

如果您需要多个键,那么最好键转换为列表一次,然后在恒定时间内在列表中进行查找。例子:

Iterable randomKeys(Map map) sync* {
  var keys = map.keys.toList();
  var rnd = new Random();
  while (keys.length > 0) {
    var index = rnd.nextInt(keys.length);
    var key = keys[index];
    keys[index] = keys.last;
    keys.length--;
    yield key;
  }
} 
Run Code Online (Sandbox Code Playgroud)

除了获得更好的性能之外,获取密钥的副本还可以避免并发修改错误。