You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart开发:实现列表搜索优先返回匹配项、再展示其余剩余条目

要实现优先展示匹配条目、剩余条目按原顺序排列的效果,你可以通过拆分列表后合并或者自定义排序两种方式实现,以下是可直接运行的修改后代码:

方法1:拆分匹配/不匹配列表后拼接(推荐,性能更优)

该方法时间复杂度为O(n),适合大列表使用,完全保留原列表非匹配项的顺序:

void main(){
  List<String> topics = [
    'Photography',
    'News',
    'Facts',
    'How-to',
    'Technology',
    'Science',
    'Space',
  ];
  
  var text = 'tech';
  // 统一转为小写判断,避免大小写匹配遗漏
  final lowerSearchText = text.toLowerCase();
  // 筛选匹配的条目
  final matched = topics.where((e) => e.toLowerCase().contains(lowerSearchText)).toList();
  // 筛选不匹配的条目,保留原顺序
  final unmatched = topics.where((e) => !e.toLowerCase().contains(lowerSearchText)).toList();
  // 拼接得到最终结果
  final searchResult = [...matched, ...unmatched];
  
  // 逐行打印输出
  for (var item in searchResult) {
    print(item);
  }
}

方法2:自定义排序实现

该方法写法更简洁,适合元素较少的列表使用:

void main(){
  List<String> topics = [
    'Photography',
    'News',
    'Facts',
    'How-to',
    'Technology',
    'Science',
    'Space',
  ];
  
  var text = 'tech';
  final lowerSearchText = text.toLowerCase();
  // 拷贝原数组后排序,避免修改原数组
  final searchResult = List.of(topics)..sort((a, b) {
    final aMatch = a.toLowerCase().contains(lowerSearchText);
    final bMatch = b.toLowerCase().contains(lowerSearchText);
    // 匹配项永远排在非匹配项前面
    if (aMatch && !bMatch) return -1;
    if (!aMatch && bMatch) return 1;
    // 同类型条目保留原列表相对顺序
    return 0;
  });
  
  // 逐行打印输出
  for (var item in searchResult) {
    print(item);
  }
}

另外你原有代码中的搜索判断条件存在冗余:topics.contains(text) || topics.toLowerCase().contains(text) 仅保留toLowerCase()后的判断即可覆盖所有大小写匹配场景。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:15:02