[英]How can I sort a list alphabetically based on the Hebrew language in Dart?
在 Dart 中,如果我有一个列表:
final myList = ['b', 'a'];
我想按字母顺序对它进行排序,我会使用:
myList.sort(
(String a, String b) => a.compareTo(b),
);
myList 的myList
现在是:
['a', 'b']
现在,这适用于英文字母表中的字母。
但如果我有一份希伯来语的清单:
final unorderedHebAlphabet = ['א', 'ב'];
我不能像上面那样使用 with 对它进行排序:
unorderedHebAlphabet.sort((String a, String b) =>
a.compareTo(b))
它不排序。
应为 output,而不是:
['א', 'ב']
应该:
['ב', 'א']
作为参考,排序的希伯来字母表将按以下顺序排列:
final sortedHebrewAlphabet = [
'א',
'ב',
'ג',
'ד',
'ה',
'ו',
'ז',
'ח',
'ט',
'י',
'כ',
'ל',
'מ',
'נ',
'ס',
'ע',
'פ',
'צ',
'ק',
'ר',
'ש',
'ת',
];
它确实排序(按 UTF-16 代码单元),但它以一种不直观的方式显示。 final unorderedHebAlphabet = ['א', 'ב'];
似乎被解析为 RTL,因此在构造的列表中,元素 0 是א
,元素 1 是ב
。 这已经是所需的顺序,因此对其进行排序不会改变它。 (混合 LTR 和 RTL 文本令人困惑。)
例如:
import 'package:collection/collection.dart';
void main() {
var literal = ['א', 'ב'];
print(literal[0]); // Prints: א
print(literal[1]); // Prints: ב
const alef = 'א';
const bet = 'ב';
const expectedOrder = [alef, bet];
const listEquals = ListEquality();
print(listEquals.equals(literal..sort(), expectedOrder)); // Prints: true
print(listEquals.equals([bet, alef]..sort(), expectedOrder)); // Prints: true
}
如果您在 output 前加上 Unicode LTR 覆盖 (U+202D) 以强制将文本呈现为 LTR,您还可以观察到元素以正确的顺序打印。 比较:
const ltr = '\u202D';
print('$expectedOrder');
print('$ltr$expectedOrder');
或者您可以简单地单独打印元素:
expectedOrder.forEach(print);
打印:
א
ב
我没有处理 RTL 文本的经验,但我可能会避免在代码中混合 LTR 和 RTL 文本,而是将它们表示为十六进制 Unicode 代码点以避免混淆。
它正在以正确的顺序打印出来。 它是按原样打印的控制台。
当您将排序后的列表保存到文件中并再次读取时,您会得到אב
字符作为前两个字符。 所以它们是按正确的顺序编写/迭代的。
如果您每行打印一个字母的值,您将获得所需的结果。 我不是 100% 确定控制台如何处理它,但 dart 只是将它传递到STDOUT
(默认控制台),并且控制台检测到该字符串实际上是 RTL 并以这种方式打印(或写入 STDOUT)。
我做了一些你可以看到的小摆弄:
import 'dart:io';
void main(List<String> arguments) {
final myList = [
'א',
'ב',
'ג',
'ד',
'ה',
'ו',
'ז',
'ח',
'ט',
'י',
'כ',
'ל',
'מ',
'נ',
'ס',
'ע',
'פ',
'צ',
'ק',
'ר',
'ש',
'ת'
];
// for (var i in myList) {
// print("$i => ${i.runes.toList()}");
// }
myList.sort();
String s = "";
for (var i in myList) {
s += i;
}
print('$s');
print(myList.first);
final file = new File('/Users/rahul/Desktop/string_l/test.txt');
file.writeAsStringSync(s, flush: true);
final read = file.readAsStringSync().substring(0, 2);
print(read);
// You can also verify by calling print with every element
for (var i in myList) {
print(i);
}
}
output
אבגדהוזחטיכלמנסעפצקרשת
א
אב
א
ב
ג
ד
ה
ו
ז
ח
ט
י
כ
ל
מ
נ
ס
ע
פ
צ
ק
ר
ש
ת
import 'dart:io';
final unorderedHebAlphabet = [
'ב',
'ג',
'ד',
'ה',
'ו',
'ז',
'ח',
'ט',
'י',
'כ',
'ל',
'מ',
'נ',
'ס',
'ע',
'פ',
'צ',
'ק',
'ר',
'ש',
'ת',
'א'
];
void main() {
print(unorderedHebAlphabet);
unorderedHebAlphabet
.sort((a, b) => a.codeUnitAt(0).compareTo(b.codeUnitAt(0)));
print(unorderedHebAlphabet);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.