78

ListDartで簡単にフラット化するにはどうすればよいですか?

例えば:

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

どうすれば、つまり、これらすべての値を含む単一に変換aできますか?bList

4

6 に答える 6

151

私が知っている最も簡単な方法はIterable.expand()、恒等関数で使用することです。expand()Iterableの各要素を受け取り、iterable(「展開」部分)を返す関数を実行して、結果を連結します。他の言語では、flatMapとして知られている場合があります。

したがって、恒等関数を使用することにより、expandはアイテムを連結するだけです。本当にリストが必要な場合は、を使用してtoList()ください。

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var flat = a.expand((i) => i).toList();
于 2013-03-14T15:30:49.027 に答える
8

そのための組み込みのメソッドはないと思いますが、いつでも単一の値に減らすことができます。

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));
于 2013-03-14T15:23:39.763 に答える
7

Dart 2.3以降では、代わりにcollection-forおよびspread演算子を使用して、リストを簡単にフラット化できます。私は個人的にそれを使用するよりも読みやすいと思いますIterable.expand

List<T> flatten<T>(Iterable<Iterable<T>> list) =>
    [for (var sublist in list) ...sublist];

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = flatten(a);
print(b); // Prints: [1, 2, 3, a, b, c, true, false, true] 

再帰的にフラット化する必要があるネストされたリストがある場合は、次を使用できます。

List<T> flattenDeep<T>(Iterable<dynamic> list) => [
      for (var element in list)
        if (element is! Iterable) element else ...flattenDeep(element),
    ];

var a = [[1, [[2], 3]], [[['a']], 'b', 'c'], [true, false, [true]]];
var b = flattenDeep(a);
print(b) // Prints: [1, 2, 3, a, b, c, true, false, true] 
于 2020-12-25T07:04:11.773 に答える
5

これは、ジェネレーターを使用して効率的に行うことができます。

Iterable<T> flatten<T>(Iterable<Iterable<T>> items) sync* {
  for (var i in items) {
    yield* i;
  }
}

Iterable<X> flatMap<T,X>(Iterable<Iterable<T>> items, X Function(T) f) =>
  flatten(items).map(f);

于 2019-11-14T04:06:26.490 に答える
3

Expandメソッドを使用したソリューションは、このケースを満たすのに適しています。

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

よろしくお願いします、

セバスチャン

于 2014-03-08T05:24:45.730 に答える
1

単一の要素も許可し、深くネストされたリストをフラット化するこの再帰的なソリューションを試すことができます。

List flatten(List arr) => 
  arr.fold([], (value, element) => 
   [
     ...value, 
     ...(element is List ? flatten(element) : [element])
   ]);

于 2021-01-05T07:37:18.227 に答える