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

如何在Dart中按土耳其语字母顺序对字符串排序?

解决Dart中土耳其语字符串排序问题

Dart默认的compareTo方法基于Unicode码点排序,无法适配土耳其语的字母规则。要实现符合土耳其语规范的排序,可以通过自定义字符权重映射来实现类似Java Collator的功能。

实现步骤

  1. 定义土耳其语字母排序权重:根据土耳其语字母顺序,为每个字符分配对应的排序优先级数值。
  2. 生成排序键:将目标字符串转换为基于权重的可比较字符串,确保排序时遵循土耳其语规则。
  3. 使用排序键排序:通过比较转换后的排序键完成排序。

完整代码示例

// 土耳其语字母排序权重映射,覆盖大小写
final turkishCharOrder = {
  'a': 0, 'b': 1, 'c': 2, 'ç': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'ğ': 8,
  'h': 9, 'ı': 10, 'i': 11, 'j': 12, 'k': 13, 'l': 14, 'm': 15, 'n': 16,
  'o': 17, 'ö': 18, 'p': 19, 'r': 20, 's': 21, 'ş': 22, 't': 23, 'u': 24,
  'ü': 25, 'v': 26, 'y': 27, 'z': 28,
  'A': 0, 'B': 1, 'C': 2, 'Ç': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'Ğ': 8,
  'H': 9, 'I': 10, 'İ': 11, 'J': 12, 'K': 13, 'L': 14, 'M': 15, 'N': 16,
  'O': 17, 'Ö': 18, 'P': 19, 'R': 20, 'S': 21, 'Ş': 22, 'T': 23, 'U': 24,
  'Ü': 25, 'V': 26, 'Y': 27, 'Z': 28,
};

// 生成土耳其语排序键
String getTurkishSortKey(String str) {
  return str.split('').map((char) {
    // 未知字符分配高权重,排在最后
    final order = turkishCharOrder[char] ?? 99;
    // 用两位数字保证排序时位数一致,避免10和2这样的数值比较错误
    return order.toString().padLeft(2, '0');
  }).join();
}

void main() {
  var countries = ["Belgrad", "Belçika", "Irak", "İran", "Sudan", "Şili", "Çek Cumhuriyeti", "Cezayir", "Ukrayna", "Ürdün"];
  
  // 使用自定义排序键排序
  countries.sort((a, b) => getTurkishSortKey(a).compareTo(getTurkishSortKey(b)));
  print(countries);
  // 输出: [Belçika, Belgrad, Cezayir, Çek Cumhuriyeti, Irak, İran, Sudan, Şili, Ukrayna, Ürdün]
}

说明

  • 权重映射覆盖了土耳其语所有特殊字符的大小写形式,确保排序时大小写不影响规则(如需区分大小写可调整映射)。
  • 未知字符被分配默认权重99,会排在所有已知字符之后。
  • 转换后的排序键是固定位数的数字字符串,避免了数值比较时的位数偏差问题,保证排序逻辑准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:16:33