显然是在玩飞镖,对它仍然很陌生,并实现了井字游戏。因此,我有一个获胜位置列表的列表,想要检查是否有任何列表是输入的移动列表的子列表。听起来很简单,所以我申请了内部清单中的每个元素,我想检查一下自己的状况。有哪些飞镖方法可以实现这一目标。这是行不通的,因为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))));
答案 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])));
,where
,firstWhere
,...
答案 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.
您主动用列表填充列表,然后立即在下面几行中用新列表覆盖这些值。