Как сгладить список? - программирование
Подтвердить что ты не робот

Как сгладить список?

Как я могу легко сгладить 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 содержащий все эти значения?

4b9b3361

Ответ 1

Самый простой способ, которым я знаю, - использовать Iterable.expand() с функцией идентификации. expand() принимает каждый элемент Iterable, выполняет на нем функцию, которая возвращает итерируемую (часть "expand" ), а затем объединяет результаты. На других языках он может быть известен как flatMap.

Таким образом, используя функцию идентификации, expand просто конкатенирует элементы. Если вам действительно нужен Список, используйте toList().

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

Ответ 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));

Ответ 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;
}

С уважением,

Себастьен