Flutter : List<Document>,如何根据标题去除重复文档

Posted

技术标签:

【中文标题】Flutter : List<Document>,如何根据标题去除重复文档【英文标题】:Flutter : List<Document>, how to remove duplicate documents according to its title 【发布时间】:2021-02-28 21:13:08 【问题描述】:

假设我有一个像这样的类文档:

class Document 

  String text;
  String title;
  String date;


我创建了一个文档列表(List Document listDocs),我想删除具有相同标题的文档,只保留日期最早的文档。

例如,如果我有 3 个标题相同(但文本和日期不同)的文档,我只想保留日期最早的文档。

有没有简单的方法?

谢谢!!

【问题讨论】:

【参考方案1】:

要按日期对对象列表进行排序,您可以使用MyDocumentList.sort((a, b) =&gt; a.date.compareTo(b.date));

为了确保没有第二个具有相同标题的对象,您可以使用Set.,即

A collection of objects in which each object can occur only once.

在这个集合中,您将存储所有看到的标题。然后你会遍历MyDocumentList,尝试存储它的标题并且只添加一个新的DocumentuniqueDocuments,如果seenDocumentTitles不包含当前Document的标题(如果seenDocumentTitles.add返回true,表示该集合不包含文档标题)

Set<String> seenDocumentTitles = Set<String>();
List<Document> uniqueDocuments = MyDocumentList.where((document) => seenDocumentTitles.add(document.title)).toList();

举个例子,看看这个: https://dartpad.dartlang.org/20a889b174d2e45f7255d1b110be0627

【讨论】:

【参考方案2】:

您可以添加一个从两个给定日期返回较早日期时间对象的函数,如下所示:

DateTime longer(String dateString, String dateString2) 
  DateTime dateTime = DateFormat("yyyy-MMMM-dd").parse(dateString);
  DateTime dateTime2 = DateFormat("yyyy-MMMM-dd").parse(dateString2);

  return dateTime.isBefore(dateTime2) ? dateTime : dateTime2;

然后,要检查这三个日期中的哪个日期更早,您可以在类中添加一个方法,例如:

DateTime longest(String dateTime, String dateTime2) 
DateTime thisDate = DateFormat("yyyy-MMMM-dd").parse(this.date);
  return thisDate.isBefore(longer(dateTime, dateTime2)) ? thisDate : longer(dateTime, dateTime2);

如果您想将该方法与 Document 类分离,您可以这样做:

DateTime longest(String dateTime, String dateTime2, String dateTime3) 
DateTime firstDate = DateFormat("yyyy-MMMM-dd").parse(dateTime);

  return firstDate.isBefore(longer(dateTime2, dateTime3)) ? firstDate : longer(dateTime2, dateTime3);

【讨论】:

以上是关于Flutter : List<Document>,如何根据标题去除重复文档的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中将 List<List<dynamic>> 转换为 ArrayList

Flutter/Dart - “List<dynamic>”不是“List<Product>”类型的子类型

Flutter/Firebase - List<dynamic> 没有实例 getter 'documents'

类型 'List<dynamic>' 不是类型 'FutureOr<List<RideData>>' 的子类型,Flutter

Flutter - 如何更新 List<Map>

Flutter - 无法修改 List<Widget>