如何在 Dart 中对 List<File> 进行排序,最后使用 null 对象

Posted

技术标签:

【中文标题】如何在 Dart 中对 List<File> 进行排序,最后使用 null 对象【英文标题】:How to sort List<File> in Dart with null objects at end 【发布时间】:2020-05-23 14:29:15 【问题描述】:

开始为一个研究项目使用 Flutter,我想知道如何对文件列表进行排序。

确实,我的程序有一个这样初始化的 4 个文件的列表:

List<File> imageFiles = List(4);

这个初始化实际上意味着我的列表是这样的:[null,null,null,null]

当用户执行操作时,此列表可以填满。但是,用户可以随时删除文件,这会给我们以下情况:[file A, null, null, file d]

我的问题是,当删除到达时如何对列表进行排序,以便获得一个空对象始终位于最后的列表 ([file A, file D, null, null])。

我已经看过很多主题,但它们从不涉及 DART。

提前感谢您的帮助。

【问题讨论】:

应该有4个有什么原因吗?拥有最少 0 个和最多 4 个图像文件是业务要求吗? 是的,用户不能加载超过 4 个文件 我建议创建一个可以处理该问题的“值对象”。我将它添加到下面的答案中,只需一分钟 【参考方案1】:

你可以试试这个:

这个地方最后都是空的。

sortedList.sort((a, b) 
  int result;
  if (a == null) 
    result = 1;
   else if (b == null) 
    result = -1;
   else 
    // Ascending Order
    result = a.compareTo(b);
  
  return result;
)

【讨论】:

如果您希望在开头使用空值,只需将result = 1result = -1 行颠倒即可。【参考方案2】:

您可以使用list.sort((a, b) =&gt; a == null ? 1 : 0);对列表进行排序

这是一个完整的示例,使用String 而不是File,您可以在DartPad 上运行

void main() 
  List<String> list = List(4);
  list[0] = "file1";
  list[3] = "file4";

  print("list before sort: $list"); 
  // list before sort: [file1, null, null, file4]

  list.sort((a, b) => a == null ? 1 : 0);

  print("list after sort: $list"); 
  // list after sort: [file1, file4, null, null]


如果业务需求最多有4个文件,我建议创建一个可以处理的值对象。 例如:

class ImageList 
  final _images = List<String>();

  void add(String image) 
    if(_images.length < 4) 
      _images.add(image);
    
  

  void removeAt(int index) 
    _images.removeAt(index);
  

  String get(int index) 
    return _images[index];
  

  List getAll() 
    return _images;
  

你可以这样运行它:

void main() 
  ImageList imageList = ImageList();
  imageList.add("file1");
  imageList.add("file2");
  imageList.add("file3");
  imageList.add("file4");
  imageList.add("file5"); // won't be add

  print("imagelist: $imageList.getAll()");
  // imagelist: [file1, file2, file3, file4]

  imageList.removeAt(2); // remove file3
  print("imagelist: $imageList.getAll()");
  // imagelist: [file1, file2, file4]

这将使控制变得更容易。 (此示例再次使用String 而不是File

【讨论】:

哇,完美运行,感谢您快速而宝贵的回答! 感谢您的编辑以及进一步的信息和帮助!

以上是关于如何在 Dart 中对 List<File> 进行排序,最后使用 null 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dart 中对列表进行排序? [复制]

你如何在 Dart 中对异常进行单元测试?

如何删除 List<MyDataModel> 的重复项(Dart/Flutter)

Dart/Flutter - 如何删除 List 中 Map 元素的键值对?

如何使用 dart 将 Uint8list 转换为 List<int>?

Dart 压缩 Uint8List 图像