如何扁平化的列表?(How to flatten a List?)

2019-07-21 15:47发布

我怎样才能轻松地展平List中镖?

例如:

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = [1, 2, 3, 'a', 'b', 'c', true, false, true];

如何打开ab ,即到一个单一的List包含了所有这些价值观?

Answer 1:

我知道最简单的方法是使用Iterable.expand()与身份的功能。 expand()需要一个可迭代中的每个元素,执行在其上的函数,返回一个可迭代(即“扩展”的一部分),然后串接结果。 在其他语言可以被称为flatMap。

因此,通过使用一种身份的功能,扩大只会拼接的项目。 如果你真的想要一个列表,然后使用toList()

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var flat = a.expand((i) => i).toList();


Answer 2:

我不认为有应该是一个内置的方法,但你总是可以将其降低到一个值:

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));


Answer 3:

该解决方案与拓展方法适合很好的满足这种情况下:

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;
}

最好的祝福,

塞巴斯蒂安



文章来源: How to flatten a List?
标签: dart