我怎样才能轻松地展平List
中镖?
例如:
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = [1, 2, 3, 'a', 'b', 'c', true, false, true];
如何打开a
到b
,即到一个单一的List
包含了所有这些价值观?
我怎样才能轻松地展平List
中镖?
例如:
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = [1, 2, 3, 'a', 'b', 'c', true, false, true];
如何打开a
到b
,即到一个单一的List
包含了所有这些价值观?
我知道最简单的方法是使用Iterable.expand()
与身份的功能。 expand()
需要一个可迭代中的每个元素,执行在其上的函数,返回一个可迭代(即“扩展”的一部分),然后串接结果。 在其他语言可以被称为flatMap。
因此,通过使用一种身份的功能,扩大只会拼接的项目。 如果你真的想要一个列表,然后使用toList()
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var flat = a.expand((i) => i).toList();
我不认为有应该是一个内置的方法,但你总是可以将其降低到一个值:
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var flatten = a.reduce([], (p, e) {
p.addAll(e);
return p;
});
print(flatten);
我希望addAll()
将返回原来的列表中。 目前,它没有返回值。 如果真是这样,可以编写单个衬垫: a.reduce([], (p, e) => p.addAll(e))
或者,你可以在列表中,并添加循环:
var flatten = [];
a.forEach((e) => flatten.addAll(e));
该解决方案与拓展方法适合很好的满足这种情况下:
expect(ListTools.getFlatList([[1],["hello",2],["test"]]),orderedEquals([1,"hello",2,"test"]));
但不适合那些论文
expect(ListTools.getFlatList([[1],["hello",2,["foo",5]],["test"]]),orderedEquals([1,"hello",2,"foo",5,"test"]));
expect(ListTools.getFlatList([1,["hello",2],"test"]),orderedEquals([1,"hello",2,"test"]));
为了满足论文测试用例,你需要更多的东西像递归以下功能:
List getFlatList(List list) {
List internalList = new List();
list.forEach((e) {
if (e is List) {
internalList.addAll(getFlatList(e));
} else {
internalList.add(e);
}
});
return internalList;
}
最好的祝福,
塞巴斯蒂安