在 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<String, String>' has no instance getter 'date'. Receiver: _LinkedHashMap len:2 Tried calling: date)
。我该如何解决这个问题?
请提供您用于列表的数据类型,或您想要重新排列的实际示例列表。
用附加代码编辑了我的问题,以供您理解!请看一下。
我已经编辑了我的答案以反映您对问题的修改。
你能解释一下为什么你使用List<Repeat>
而不是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 中重新排列列表映射的主要内容,如果未能解决你的问题,请参考以下文章