Dart:如何将函数应用于列表列表的每个内部元素

Dart:如何将函数应用于列表列表的每个内部元素,dart,Dart,显然是在玩飞镖,对它还是个新手,而且还实施了tic-tac-toe。因此,我有一个获胜位置列表,并想检查是否有任何列表是输入移动列表的子列表。听起来很简单,所以我申请了内部列表的每个元素,我想检查我的条件。dart实现这一点的方法有哪些。这不起作用,因为map expect函数的类型为void,我为每个内部列表的每个元素返回一些打印调用。为什么它没有给我任何错误 我尝试了.forEach和.takeWhile示例,但无法使其工作 List <List<int>> winM

显然是在玩飞镖,对它还是个新手,而且还实施了tic-tac-toe。因此,我有一个获胜位置列表,并想检查是否有任何列表是输入移动列表的子列表。听起来很简单,所以我申请了内部列表的每个元素,我想检查我的条件。dart实现这一点的方法有哪些。这不起作用,因为map expect函数的类型为void,我为每个内部列表的每个元素返回一些打印调用。为什么它没有给我任何错误

我尝试了.forEach和.takeWhile示例,但无法使其工作

List <List<int>> winMoves = new List.generate(8, (i) => new List(3));
winMoves[0]=[1,2,3];
winMoves[1]=[4,5,6];
winMoves[2]=[7,8,9];
winMoves[3]=[1,4,7];
winMoves[4]=[2,5,8];
winMoves[5]=[3,6,9];
winMoves[6]=[1,5,9];
winMoves[7]=[3,5,7];
winMoves.map((list) => (list.forEach((el) => print(el))));
List-winMoves=new-List.generate(8,(i)=>new-List(3));
winMoves[0]=[1,2,3];
winMoves[1]=[4,5,6];
winMoves[2]=[7,8,9];
winMoves[3]=[1,4,7];
winMoves[4]=[2,5,8];
winMoves[5]=[3,6,9];
winMoves[6]=[1,5,9];
winMoves[7]=[3,5,7];
winMoves.map((list)=>(list.forEach((el)=>print(el));
import'包装:collection/collection.dart'显示质量;
...
常量eq=常量ListQuality();
打印(winMoves.indexWhere((list)=>eq.equals(list[1,5,9]));

根据您想要的结果,您还可以使用
where
firstWhere
any
,…

解决此问题的方法有很多,具体取决于所需的结果

您有一个元素列表,并且希望检查关于这些元素的一些信息(在本例中,元素也是列表,但这并不重要)

如果您想知道是否有任何元素满足您的检查要求,可以使用:

bool hasWin = winMoves.any((moves) => ...check...);
var win = winMoves.firstWhere((moves) => ...check..., orElse: null);
如果要查找满足检查要求的元素,可以使用:

bool hasWin = winMoves.any((moves) => ...check...);
var win = winMoves.firstWhere((moves) => ...check..., orElse: null);
如果您想找到所有获奖者:

var wins = winMoves.where((moves) => ...check...).toList();  // `where` is lazy.
如何开支票是另一个问题。在这种情况下,正如Günther Zöchbauer所写,您似乎想要

(moves) => moves.every(expectedMoves.contains)
您的示例没有给您任何警告或错误,因为它是正确的,并且实际上没有做任何事情。
map
函数是惰性的,它创建了一个
Iterable
,在您开始迭代之前,它不会做任何事情。如果对其调用
.toList()
,它将创建一个
列表
。不是很有用,但在Dart 2中有效

此外,您的初始
winMoves
初始化过于复杂。您只需执行以下操作:

List<List<int>> winMoves = []..length = 8;  // for growable list, or
List<List<int>> winMoves = List(8);         // for fixed-length list.
List winMoves=[]…length=8;//用于可增长列表,或
List winMoves=List(8);//用于固定长度列表。

您主动用列表填充列表,然后立即用以下行中的新列表覆盖这些值。

您实际上想做什么来代替
print(el)
?是否要检查
winMoves
是否包含
[1,5,9]
?顺序是否相关或是否匹配?例如,我有一个移动列表[5,7,8,1,9]。我想检查[5,7,8,1,9]是否包含每个元素形式[5,9,1]。在本例中,您可以使用
winMoves.indexWhere((list)=>[5,9,1]。every((val)=>list.contains(val))
您的意思类似于winMoves.indexWhere((list)=>list.every((val)=>player1.contains(val))//Player1是[5,7,8,1,9]。谢谢你的帮助。看起来不错,是的。