从列表中获取随机项目而不重复或重复 - Dart

Fetch random items from list without duplicate or repetition - Dart

我正在尝试从一个列表中随机获取特定数量的项目并将它们添加到另一个列表但不重复。

例如:从列表中随机挑选三个随机项目,并将它们放入另一个列表中。这是我到目前为止所取得的成就,但这可能会再次选择重复的项目。

List itemList = ['NAME1', 'NAME2', 'NAME3', 'NAME4', 'NAME3', 'NAME5', 'NAME2'];

List randomItems = [];


for(var i=0; i<=2; i++){ // run the loop for three times
  int randomNumber = Random().nextInt(itemList.length); //generate random number within itemList range
  randomItems.add(itemList[randomNumber]); // duplication occur, for example: NAME2 could be added two times
}

我们可以采取几个步骤来解决这个问题。首先,我们要去掉列表中的重复元素。我们可以通过将列表转换为 Set:

来做到这一点
  List<String> itemList = [
    'NAME1',
    'NAME2',
    'NAME3',
    'NAME4',
    'NAME3',
    'NAME5',
    'NAME2'
  ];
  Set<String> itemSet = itemList.toSet();
  print(itemSet); // {NAME1, NAME2, NAME3, NAME4, NAME5}

然后,我们想从这个新的 Set 中提取 3 个随机元素,这样我们就不能 select 相同的元素两次。解决这个问题的最简单方法是随机打乱元素,然后从我们的集合中取出元素。但是 Set 没有任何特定“顺序”的概念,因此我们不能洗牌 Set.

所以让我们将 Set 转换回 List:

  Set<String> itemSet = itemList.toSet();
  List<String> itemListFromSet = itemSet.toList();
  print(itemListFromSet); // [NAME1, NAME2, NAME3, NAME4, NAME5]

然后我们可以洗牌这个新列表:

  itemListFromSet.shuffle();
  print(itemListFromSet); // [NAME3, NAME2, NAME4, NAME5, NAME1]

如果我们想要 3 个随机的 selected 元素,我们可以从这个随机排序的列表中取出 3 个元素。所以例如(take returns 一个可迭代对象,然后我们创建一个新列表):

List<String> randomItems = itemListFromSet.take(3).toList();

完整的解决方案如下所示:

void main() {
  List<String> itemList = [
    'NAME1',
    'NAME2',
    'NAME3',
    'NAME4',
    'NAME3',
    'NAME5',
    'NAME2'
  ];
  Set<String> itemSet = itemList.toSet();
  List<String> itemListFromSet = itemSet.toList();

  itemListFromSet.shuffle();

  List<String> randomItems = itemListFromSet.take(3).toList();

  print(randomItems); // [NAME5, NAME2, NAME4]
}

可以减少到:

void main() {
  List<String> itemList = [
    'NAME1',
    'NAME2',
    'NAME3',
    'NAME4',
    'NAME3',
    'NAME5',
    'NAME2'
  ];
  List<String> randomItems =
      (itemList.toSet().toList()..shuffle()).take(3).toList();

  print(randomItems); // [NAME3, NAME4, NAME2]
}