在Dart中根据给定字符串中的位置对单词列表排序
在Dart中根据原字符串位置排序子串列表
实现思路
核心逻辑是按照每个子串在原字符串中首次出现的起始索引对列表排序,匹配时忽略大小写(适配示例里的大小写差异),同时保留子串原本的格式。
完整代码实现
List<String> sortByPositionInSource(String source, List<String> items) { // 转小写用于不区分大小写的匹配 final lowerSource = source.toLowerCase(); // 为每个子串绑定它在原字符串中的起始索引 final itemWithPosition = items.map((item) { final lowerItem = item.toLowerCase(); final position = lowerSource.indexOf(lowerItem); return {'item': item, 'position': position}; }).toList(); // 按起始位置排序,找不到的子串(position=-1)放在末尾 itemWithPosition.sort((a, b) { if (a['position'] == -1 && b['position'] != -1) return 1; if (b['position'] == -1 && a['position'] != -1) return -1; return a['position']!.compareTo(b['position']!); }); // 提取排序后的子串 return itemWithPosition.map((e) => e['item'] as String).toList(); } // 测试示例 void main() { const source = "Karim is an engineer"; const items = ["engine","karim is","an"]; final sortedItems = sortByPositionInSource(source, items); print(sortedItems); // 输出: [Karim is, an, engine] }
代码说明
- 大小写兼容:将原字符串和子串统一转小写后匹配,确保"karim is"能匹配原字符串中的"Karim is",同时保留子串原本的大小写格式。
- 索引计算:用
indexOf获取子串的起始位置,找不到的子串会返回-1,排序时这类子串会被放到列表最后。 - 排序逻辑:按起始索引从小到大排序,完全贴合示例的需求。
扩展:严格大小写匹配版本
如果需要严格区分大小写,去掉转小写的逻辑即可:
List<String> sortByPositionInSourceCaseSensitive(String source, List<String> items) { final itemWithPosition = items.map((item) { final position = source.indexOf(item); return {'item': item, 'position': position}; }).toList(); itemWithPosition.sort((a, b) { if (a['position'] == -1 && b['position'] != -1) return 1; if (b['position'] == -1 && a['position'] != -1) return -1; return a['position']!.compareTo(b['position']!); }); return itemWithPosition.map((e) => e['item'] as String).toList(); }
内容的提问来源于stack exchange,提问作者karim mesghouni
相关产品推荐
相关产品推荐

