如何在Flutter中从列表中创建子列表

j7dteeu8  于 2023-10-22  发布在  Flutter
关注(0)|答案(4)|浏览(137)

我有一个数字列表,我想做一个子列表,每个子列表从1开始,到3结束。
这是我的清单:
List<String> items = [ '1', '2', '3', '1', '2', '4', '3', '1', '3' ];
这就是我想要的:listOfLists = [[1,2,3], [1,2,4,3], [1,3]]

insrf1ej

insrf1ej1#

一个简单的方法是

listOfLists = items.join().split(RegExp(r'(?<=3)(?=1)')).map((e) => e.split('')).toList();

编辑:
我在第一次回答后就知道了splitBetween。这将使它更加简洁:

listOfLists = items.splitBetween((first, second) => first == '3' && second == '1').toList();

这确实需要collection包,因此您还需要

import 'package:collection/collection.dart';
3gtaxfhh

3gtaxfhh2#

你可以像这样浏览你的列表:

void main() {
  List<String> items = ['1', '2', '3', '1', '2', '4', '3', '1', '3'];
  List<List<String>> listOfLists = [];

  int? startIndex;
  int? endIndex;

  for (int i = 0; i < items.length; i++) {
    final item = items[i];

    if (item == '1') {
      if (startIndex != null && endIndex != null) {
        listOfLists.add(items.sublist(startIndex, endIndex + 1));
      }
      startIndex = i;
      endIndex = null;
    } else if (item == '3') {
      endIndex = i;
    }
  }

  // Add the last sublist if it ends with '3'
  if (startIndex != null && endIndex != null) {
    listOfLists.add(items.sublist(startIndex, endIndex + 1));
  }

  print(listOfLists);
}

初始化listOfLists以存储子列表。遍历原始列表项:当遇到“1”时,将startIndex设置为当前索引。当遇到“3”时,将endIndex设置为当前索引。如果在找到“3”之前再次找到“1”,则意味着新的子列表已经启动,因此将前一个子列表添加到listOfLists。最后,如果最后一个子列表以“3”结尾,则添加它。

gpnt7bae

gpnt7bae3#

我根据猜测添加了几个测试:

void main(List<String> arguments) {
  final items = ['1', '2', '3', '1', '2', '4', '3', '1', '3'];
  var accum = <String>[];
  final result = <List<String>>[];
  for (final item in items) {
    print(item);
    switch (item) {
      case '1':
        if (accum.isNotEmpty) {
          throw Exception('accum is not empty $accum but saw 1');
        }
        accum.add(item);

      case '3':
        if (accum.isEmpty) {
          throw Exception('accum is empty but saw 3');
        }
        accum.add(item);
        result.add(accum);
        accum = [];
      default:
        if (accum.isEmpty) {
          throw Exception('accum is empty but saw $item, not 1');
        }
        accum.add(item);
    }
  }
  if (accum.isNotEmpty) {
    throw Exception('accum is not empty but saw $accum');
  }
  print(result);
}
rjee0c15

rjee0c154#

你也可以使用sublist()方法来创建整个列表的子列表,从某个索引开始:
List number = [1,2,3,4,5]; List sublist = numbers.sublist(2);
print();// [3,4,5]

相关问题