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

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

[
data{text: hello, date: 2020-09-11}, data{text: hi, date: 2020-09-12},
data{text: why, date: 2020-09-11}, data{text: how, date: 2020-09-10},
data{text: when, date: 2020-09-11}, data{text: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}]

【问题讨论】:

    标签: list sqlite flutter


    【解决方案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'.
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 2020-10-29
    • 2023-02-22
    • 2023-03-15
    • 2018-05-11
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多