如何根据Dart中的希伯来语按字母顺序对列表进行排序



上下文

在Dart中,如果我有一个列表:

final myList = ['b', 'a'];

我想按字母顺序排序,我会使用:

myList.sort(
(String a, String b) => a.compareTo(b),
);

myList的输出现在是:

['a', 'b']

现在,这适用于英语字母表中的字母。

问题

但如果我有一个希伯来语的列表:

final unorderedHebAlphabet = ['א', 'ב'];

不能使用with进行如上排序:

unorderedHebAlphabet.sort((String a, String b) =>
a.compareTo(b))

它不分类。

预期输出,而不是:

['א', 'ב']

应为:

['ב', 'א']
  • 如何在希伯来语中按字母顺序对列表进行排序

备注

作为参考,希伯来语字母表的排序顺序如下:

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<String>();

print(listEquals.equals(literal..sort(), expectedOrder)); // Prints: true
print(listEquals.equals([bet, alef]..sort(), expectedOrder)); // Prints: true
}

如果您在输出前加上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);
}
}

输出

אבגדהוזחטיכלמנסעפצקרשת
א
אב
א
ב
ג
ד
ה
ו
ז
ח
ט
י
כ
ל
מ
נ
ס
ע
פ
צ
ק
ר
ש
ת
import 'dart:io';
final unorderedHebAlphabet = [
'ב',
'ג',
'ד',
'ה',
'ו',
'ז',
'ח',
'ט',
'י',
'כ',
'ל',
'מ',
'נ',
'ס',
'ע',
'פ',
'צ',
'ק',
'ר',
'ש',
'ת',
'א'
];

void main() {
print(unorderedHebAlphabet);
unorderedHebAlphabet
.sort((a, b) => a.codeUnitAt(0).compareTo(b.codeUnitAt(0)));
print(unorderedHebAlphabet);
}

最新更新