gpt4 book ai didi

dart - dart 中的嵌套循环和内存不足

转载 作者:行者123 更新时间:2023-12-03 02:55:00 26 4
gpt4 key购买 nike

我试图在嵌套的 for 循环中使用重复数据删除代码制作一个简单的随机数生成器程序。
但是当我尝试在 dartpad 或 android studio 上运行这段代码时,运行了两三次,之后,我收到了“内存不足”的消息。我的代码有问题吗?

import 'dart:math';

void main() {
final myNum = <int>[];
final random = Random();
int num;

for (int i = 0; i < 6; i++) {
num = random.nextInt(45) + 1;
myNum.add(num);

for (int j = 0; j < i; j++) {
if (myNum[i] == myNum[j]) {
i--;
break;
}
}
}

print(myNum);
}

最佳答案

原因是 DartPad 仅在没有更多工作要做时才首先显示输出(例如,等待异步操作或程序完成)。
在您的情况下,您的程序包含一个无限循环,因此程序将无休止地运行,不断向列表中添加元素,直到内存不足为止。如果您向程序添加一些额外的日志记录并在 DartVM 中运行它,这会在程序运行时打印出来,这可以看出。
你的问题可以在这里找到:

    for(int j=0; j<i; j++){
if(myNum[i]==myNum[j]){
i--;
break;
}
}
有更好的方法来检测多个值(有些人可能会争辩说使用 Set 代替),但主要问题是您永远不会从列表中删除检测到的元素。相反,您只是在数 i下。在您使用的列表中插入元素时:
    myNum.add(num);
这只是继续向现有的值列表添加元素。所以你的程序运行良好,直到 if(myNum[i]==myNum[j])是真的,它会随机发生(而且很多时候永远不会发生,这就是为什么你的编程似乎很好的原因)。
你应该添加一个 myNum.removeLast()到您的逻辑,如下所示:
    for (int j = 0; j < i; j++) {
if (myNum[i] == myNum[j]) {
i--;
myNum.removeLast();
break;
}
}
然后它按预期工作。
更新更简单的解决方案示例
一个 Set不能多次包含相同的值。因此,如果我们尝试插入一个已经属于 Set 的元素长度不变。所以我们基本上可以做到以下几点:
import 'dart:math';

void main() {
final myNum = <int>{};
final random = Random();

while (myNum.length != 6) {
myNum.add(random.nextInt(45) + 1);
}

print(myNum.toList()); // [2, 23, 40, 35, 39, 22]
}
更短的解决方案
如果您想最小化代码并获得稳定的执行时间,您还可以执行以下操作:
void main() {
print((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6)); // [6, 41, 12, 2, 11, 42]
}

关于dart - dart 中的嵌套循环和内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62888146/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com