繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM