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
相关产品推荐
相关产品推荐

