如何从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)
没有简单的方法可以从地图中选择“随机”键。我假设这里的“随机”意味着在地图的键中均匀随机地选取它。
为此,您需要在范围内选择一个随机数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)
除了获得更好的性能之外,获取密钥的副本还可以避免并发修改错误。
| 归档时间: |
|
| 查看次数: |
4419 次 |
| 最近记录: |