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

时间:2018-06-27 09:40:11

标签: dart

显然是在玩飞镖,对它仍然很陌生,并实现了井字游戏。因此,我有一个获胜位置列表的列表,想要检查是否有任何列表是输入的移动列表的子列表。听起来很简单,所以我申请了内部清单中的每个元素,我想检查一下自己的状况。有哪些飞镖方法可以实现这一目标。这是行不通的,因为map期望类型为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))));

2 个答案:

答案 0 :(得分:2)

select id,
  listagg(val, ';') within group (order by min_pos) as mergedvalues
from (
  select id, val, min(pos) as min_pos
  from test
  unpivot (val for pos in (id1 as 1, id2 as 2, id3 as 3))
  group by id, val
)
group by id
order by id;

        ID MERGEDVALUES                  
---------- ------------------------------
         1 A;B;P;C                       
         2 X;Y;Z;K                       

根据您想要的结果,您还可以使用import 'package:collection/collection.dart' show ListEquality; ... const eq = const ListEquality<int>(); print(winMoves.indexWhere((list) => eq.equals(list, [1, 5, 9]))); wherefirstWhere,...

答案 1 :(得分:1)

有许多方法可以解决此问题,具体取决于确切的预期结果。

您有一个元素列表,并且想要检查有关这些元素的某些信息(在这种情况下,这些元素也是列表,但这并不重要)。

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

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üntherZöchbauer所写的那样

(moves) => moves.every(expectedMoves.contains)

您的示例没有给出任何警告或错误,因为它是正确的,并且实际上没有任何作用。 map函数是惰性的,它创建一个Iterable,直到您开始迭代之前它不会做任何事情。如果在其上调用.toList(),它将创建一个List<void>。不太有用,但在Dart 2中有效。

此外,您初始的winMoves初始化过于复杂。您可以这样做:

List<List<int>> winMoves = []..length = 8;  // for growable list, or
List<List<int>> winMoves = List(8);         // for fixed-length list.

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