如何在 Dart 中对带有德语变音符号的字符串列表进行排序?

Tob*_*oby 6 dart flutter

如何使用变音符号对列表进行排序?\ncompareTo-Function 会忽略这些并将单词放在列表的末尾。

\n\n
main() {\n  var fruits = ['\xc3\x84pfel', 'Bananen', 'Orangen'];\n  fruits.sort((a, b) => a.compareTo(b));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Cas*_*rin 9

有一个名为diacritic的包 可以让这一切变得简单。

\n

https://pub.dev/packages/diacritic

\n

只需将依赖项放入 pubspec.yml 并使用它即可。

\n
dependencies:\n  diacritic: ^0.1.1\n
Run Code Online (Sandbox Code Playgroud)\n

导入它:

\n
import \'package:diacritic/diacritic.dart\';\n
Run Code Online (Sandbox Code Playgroud)\n

并使用它:

\n
var fruits = [\'\xc3\x84pfel\', \'Bananen\', \'Orangen\'];\nfruits.sort((a, b) => removeDiacritics(a).compareTo(removeDiacritics(b)));\nprint(fruits);\n
Run Code Online (Sandbox Code Playgroud)\n

输出将是:

\n
[\xc3\x84pfel, Bananen, Orangen]\n
Run Code Online (Sandbox Code Playgroud)\n


Hod*_*fca 6

我根据@DanielJunglas 的想法创建了自定义比较器。\n他的代码对于波兰语来说不能正常工作,我认为它对于德语也不好。它适用于波兰语,但可以用于任何语言,您只需将地图中的字母更改为您的字母表即可。它忽略所有其他非字母符号。例如,如果您希望也有“+”号进行比较,并在每个其他字母之前都有它,只需将其添加到数字最小的映射表中即可。如果有人有更简单的方法请告诉我。我也是初学者。

\n\n
main() {\n\nvar sample = [\'\xc3\x93nda\', \'Orangen\', \'\xc4\x84pfel\', \'Okren\', \'\xc5\xbcarcik\', \'Banen\', \'Alpa\', \'\xc5\x82\xc4\x85ka\', \'\xc5\xbarebak\'];\n\nPolishLettersCompare cmp = new PolishLettersCompare();\n  sample.sort(\n    (a, b) => cmp.compare(a, b)\n  );\n}\n\nclass PolishLettersCompare {\nfinal Map<String, int> map = {\n"A": 1,\n"a": 2,\n"\xc4\x84": 3,\n"\xc4\x85": 4,\n"B": 5,\n"b": 6,\n"C": 7,\n"c": 8,\n"\xc4\x86": 9,\n"\xc4\x87": 10,\n"D": 11,\n"d": 12,\n"E": 13,\n"e": 14,\n"\xc4\x98": 15,\n"\xc4\x99": 16,\n"F": 17,\n"f": 18,\n"G": 19,\n"g": 20,\n"H": 21,\n"h": 22,\n"I": 23,\n"i": 24,\n"J": 25,\n"j": 26,\n"K": 27,\n"k": 28,\n"L": 29,\n"l": 30,\n"\xc5\x81": 31,\n"\xc5\x82": 32,\n"M": 33,\n"m": 34,\n"N": 35,\n"n": 36,\n"\xc5\x83": 37,\n"\xc5\x84": 38,\n"O": 39,\n"o": 40,\n"\xc3\x93": 41,\n"\xc3\xb3": 42,\n"P": 43,\n"p": 44,\n"R": 45,\n"r": 46,\n"S": 47,\n"s": 48,\n"\xc5\x9a": 49,\n"\xc5\x9b": 50,\n"T": 51,\n"t": 52,\n"U": 53,\n"u": 54,\n"V": 55,\n"v": 56,\n"W": 57,\n"w": 58,\n"X": 59,\n"x": 60,\n"Y": 61,\n"y": 62,\n"Z": 63,\n"z": 64,\n"\xc5\xbb": 65,\n"\xc5\xbc": 66,\n"\xc5\xb9": 67,\n"\xc5\xba": 68,\n};\nint charAint;\nint charBint;\nint compare(String a, String b) {\nint min = a.length;\nif (b.length < a.length) min = b.length;\nfor (int i = 0; i < min; ++i) {\n  String charA = a[i];\n  String charB = b[i];\n  if (map.containsKey(charA)) {\n    charAint = map[charA];\n  }\n  if (map.containsKey(charB)) {\n    charBint = map[charB];\n  }\n  if (charAint > charBint)\n    return 1;\n  else if (charAint < charBint) return -1;\n}\nif (a.length < b.length)\n  return -1;\nelse if (a.length > b.length) return 1;\nreturn 0;\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n