在 Flutter 中重新排列列表映射

Posted

技术标签:

【中文标题】在 Flutter 中重新排列列表映射【英文标题】:rearrange the list map in Flutter 【发布时间】:2020-12-30 15:29:42 【问题描述】:

我有一个如下的列表地图:

[
datatext: hello, date: 2020-09-11, datatext: hi, date: 2020-09-12,
datatext: why, date: 2020-09-11, datatext: how, date: 2020-09-10,
datatext: when, date: 2020-09-11, datatext:flutter, date: 2020-09-12
]

而我想要得到的是这个:


2020-09-10 : [how], 
2020-09-11 : [hello, why, when], 
2020-09-12 : [hi, flutter]

我在 list<map>list 之间有点困惑,我不知道如何解决这个问题。 我已经知道使用方法toSet().toList() 删除重复的东西。 有没有与此相关的方法?提前致谢。

-------------------- 以下回答后 ----------------- ------

日期 => 创建时间,文本 => 重复

 loadRepeat() async 
    DBHelperRepeat sd = DBHelperRepeat();
    var list = await sd.repeats();
    List newList = [];

    if (list[0].createTime == list[1].createTime) 
      newList.add(
        'date': list[0].createTime,
        'repeat': list[0].repeat + ',' + list[1].createTime
      );
     else 
      newList.add('date': list[0].createTime, 'repeat': list[0].repeat);
      newList.add('date': list[1].createTime, 'repeat': list[1].repeat);
    

    for (int i = 2; i < list.length; i++) 
      if (list[i].createTime == newList.last.createTime) 
        newList.last.repeat += ',' + list[i].repeat;
       else 
        newList.add(list[i]);
      
    
    print(newList);
  

这是我的 sqlite 数据库代码

repeat.dart

class Repeat 
  final String repeat;
  final String createTime;
  final int year;
  final int month;
  final int date;

  Repeat(this.repeat, this.createTime, this.year, this.month, this.date);

  Map<String, dynamic> toMap() 
    return 
      'repeat': repeat,
      'createTime': createTime,
      'year': year,
      'month': month,
      'date': date
    ;
  

  @override
  String toString() 
    return 'repeat: $repeat, createTime: $createTime, year: $year, month: $month, date: $date';
  

db_repeat.dart

class DBHelperRepeat 
  var _db;

  Future<Database> get database async 
    if (_db != null) return _db;
    _db = openDatabase(
      join(await getDatabasesPath(), 'repeats.db'),
      onCreate: (db, version) 
        return db.execute(
          "CREATE TABLE repeats(repeat TEXT, createTime TEXT, year INT, month INT, date INT)",
        );
      ,
      version: 1,
    );
    return _db;
  

  Future<void> insertRepeat(Repeat repeat) async 
    final db = await database;
    await db.insert('repeats', repeat.toMap(),
        conflictAlgorithm: ConflictAlgorithm.replace);
  

  Future<List<Repeat>> repeats() async 
    final db = await database;
    final List<Map<String, dynamic>> maps = await db.query('repeats');

    return List.generate(maps.length, (i) 
      return Repeat(
          repeat: maps[i]['repeat'],
          createTime: maps[i]['createTime'],
          year: maps[i]['year'],
          month: maps[i]['month'],
          date: maps[i]['date']);
    );
  

示例数据列表:

[repeat: repeat1, createTime: 2020-09-13, year: 2020, month: 9, date: 13]

【问题讨论】:

【参考方案1】:

也许这可以帮助你:

DBHelperRepeat sd = DBHelperRepeat();
List<Repeat> list = await sd.repeats();


list.sort((a,b)=> a.createTime.compareTo(b.createTime));


List<Repeat> newList = [];

if(list.length == 0)
      return newList;
     else if(list.length == 1)
      newList.addAll(list);
      return newList;
     

    if (list[0].createTime == list[1].createTime) 
      newList.add(
        Repeat(
          createTime: list[0].createTime,
          repeat: list[0].repeat+', '+list[1].repeat,
          date: list[0].date, 
          month: list[0].month,
          year: list[0].year
        )
      );
     else 
      newList.add(list[0]);
      newList.add(list[1]);
    

   if(list.length < 3)
      return newList;
    

    for (int i = 2; i < list.length; i++) 
      if (list[i].createTime == newList.last.createTime) 

        Repeat last = newList.last;
        Repeat repeat = Repeat(
          createTime: last.createTime,
          repeat: last.repeat+', ' + list[i].repeat,
          date: last.date, 
          month: last.month,
          year: last.year
        );
        newList.removeLast();
        newList.add(repeat);
       else 
        newList.add(list[i]);
      
    
    newList.forEach((element) 
      print(element.createTime);
      print(element.repeat);
    );

【讨论】:

感谢您的回答!但我收到错误NoSuchMethodError (NoSuchMethodError: Class '_InternalLinkedHashMap&lt;String, String&gt;' has no instance getter 'date'. Receiver: _LinkedHashMap len:2 Tried calling: date)。我该如何解决这个问题? 请提供您用于列表的数据类型,或您想要重新排列的实际示例列表。 用附加代码编辑了我的问题,以供您理解!请看一下。 我已经编辑了我的答案以反映您对问题的修改。 你能解释一下为什么你使用List&lt;Repeat&gt;而不是List吗?它返回错误The name 'Repeat' isn't a type so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'Repeat'.

以上是关于在 Flutter 中重新排列列表映射的主要内容,如果未能解决你的问题,请参考以下文章

flutte学习-编译模式

flutte学习-编译模式

Flutter——最详细的Row(横向)布局使用教程

Flutter——最详细的Row(横向)布局使用教程

Flutte VS RN

在 Flutter/Dart 中映射多个列表?