【问题标题】:Create a new list of random items with a specific length in Flutter/Dart在 Flutter/Dart 中创建具有特定长度的随机项目的新列表
【发布时间】:2021-09-20 13:40:05
【问题描述】:

我有一个字符串列表,当我单击一个按钮时,我想从我的原始字符串列表中生成一个包含特定数量项目的新列表。

我能够生成一个没有重复项的随机列表,但返回的项数是随机的。例如,我想要一个包含 5 个项目的新列表,有时它会返回 2 个项目,有时会返回 4 个等。

var randomList = new List.generate(
            5, (_) => originalList[Random().nextInt(originalList.length)]).toSet().toList();

我找到了很多关于返回 1 个随机项目的信息,但没有关于倍数的信息。

编辑:

感谢大家的回复,我可以通过像这样使用随机播放来解决我的问题

var randomList = (originalList..shuffle()).take(5).toList();

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您从原始列表中获取随机项目的方法将导致重复,然后在您调用.toSet() 时将其消除,这就是您获得不同长度列表的原因。

    我们需要首先确保没有选择重复项,而不是调用.toSet() 来防止重复。

    这样做的一种方法是生成一个从0originalList.length - 1 的数字列表,然后将它们打乱,然后从该列表中选择前n 个数字,并将它们映射到原始列表中的值。

    void main() {
      List<String> originalList = ["hello", "what", "goodbye", "Test", "Apple", "Banana"];
    
      List<int> indices = List<int>.generate(originalList.length, (i) => i);
    
      indices.shuffle();
    
      int newCount = 3;
    
      List<String> randomList = indices.take(newCount).map((i) => originalList[i]).toList();
    
      print(randomList);
    }
    

    假设 dart 有一个高效的shuffle() 实现(我相信它确实如此),这种方法是有效的,并且在最坏情况下的性能为 O(n)。

    【讨论】:

      【解决方案2】:

      这里的问题是列表仍然会生成重复项。

      var randomList = new List.generate(5, (_) => originalList[Random().nextInt(originalList.length)])
      

      列表可能包含[dello, kello, hello, gello, hello] (例如,假设项目取自原始列表)

      现在对此执行.toSet() 将从列表中删除重复的hello,这就是导致列表大小随机的原因。在这种情况下,它是两个重复的,但以后可能会有更多。

      一个简单的解决方案是

      var randomList = [];
      
      List.generate(5, (_) {
         var randomString = originalList[Random().nextInt(originalList.length)];
      
         while (randomList.contains(randomString)) {
            randomString = originalList[Random().nextInt(originalList.length)];
         }
      
         randomList.add(randomString);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        • 2019-11-11
        相关资源
        最近更新 更多