如何对非英文字符串进行排序?

how to sort non-english strings?

我确实查找了答案,它们对标准字母表很有帮助。但我的情况与此不同。

所以,我正在 Java 编程。我正在编写某个程序。该程序在某些地方有一些字符串项列表。 我想根据字母表对这些字符串项进行排序。

如果我按英文字母排序,那会很容易,因为通常所有代码页都与美国信息交换标准代码 (ASCII) 兼容,并且它们已经对所有英文字母进行了排序,所以,如果我想对我的列表进行排序,我只需要比较字符的值来确定哪个字母放在哪里。

但我的问题是,我不想使用英文字母对列表进行排序。 我的程序可以选择以英语或其他一些语言显示。 问题是其中一些语言的字母表与英文字母表不同,因此字母与英文字母表中的字母不同,因此简单的 <, 和 > char 值验证不起作用,因为字母未正确排序代码页。

为了这个问题的目的,假设英语字母表如下:

a,
b,
c,
d,
e,
f,
g.

假设有一个名为 "ABC" 的国家,其字母表如下所示:

d,
b,
g,
e,
a,
c,
f.

首先,如果代码页上的 a 等于 97、b 98、c 99 等等,我如何使用此示例中的第二个字母表对列表进行排序,因为第二个字母表的第一个字母等于到 100,第二个等于 98,第三个等于 103 等等?

我的第二个问题: 不幸的是,我正在翻译我的程序的一些国家也有字母表,其中一些字母组​​合被视为一个字母。 对于我的第二个示例,假设国家 "def" 具有以下字母表:

d,
g,
be,
e,
fe,
c,
f.

此处: d - 字母表中的第一个字母, g - 字母表中的第二个字母, be - 字母表中的第三个字母(一个字母,虽然它被写成两个字母,但它被认为只是一个字母,并且在字母表中有它的位置), e - 字母表中的第四个字母, the - 字母表中的第五个字母(也写成两个字母,但被视为一个字母), c - 字母表中的第六个字母, f - 字母表中的第七个字母。

正如你在虚构国家 "def" 这个虚构的例子中看到的那样,这个国家真的搞砸了字母表。 在展示了两个假想国家的这两个字母表的这两个例子之后,您就会明白为什么我不能使用标准方法对字符串进行排序。

所以,你能帮我解决这个问题吗?我不确定我能做些什么来根据这个搞砸的字母表进行排序。

post 剧本: 这下面的几行对于这个问题并不重要,但如果有人想知道我在哪里找到这种搞砸的字母表,它们只是更多信息

好吧,我给出了那些由 7 个随机排列的字母组成的例子,只是为了这个问题的目的——为了让它更简单。如果您想知道,我真正的问题是什么 - 我正在尝试将我的程序翻译成克罗地亚语。克罗地亚语字母真的搞砸了,因为它是这样的:

1 |a
2 |b
3 |c
4 |č
5 |ć
6 |d
7 |đ
8 |đž
9 |e
10|f
11|g
12|h
13|i
14|j
15|k
16|l
17|lj
18|m
19|n
20|nj
21|o
22|p
23|r
24|s
25|š
26|t
27|u
28|v
29|z
30|ž

如你所见,克罗地亚字母与英文字母有些相似,但大部分字母与英文字母不在同一位置,其中有几个字母根本不存在于英文字母中,还有几个字母是写成两个字母的一个字母。所以真的很难分类。所以我希望有人知道一些方法。 当然,有一种最笨的排序方法,它总是有效并且可以对任何东西进行排序,那就是带有 switch 语句的方法,我在其中比较两个字符串项,对于每个字母,我使用 switch 语句,其中 switch 语句有 31+default=其中32个case,每一个都有自己的switch,有32个case。总共有 1024 个案例,如果我的平均案例有 4 行代码,我最终会得出结论,如果我想使用非英语字母表对字符串进行排序,那么我的排序方法将至少有 4096 行长。 这是一个巨大的方法。 这是最愚蠢的排序方式,但目前我只能想出一种。 所以我在这里问是因为我希望有人知道任何更简单的方法来做到这一点。该方法没有 4k 行代码那么大,只是为了对愚蠢的字符串进行排序。 我有一个对英文字符串进行排序的方法,它只占用了 10 多行代码。 我希望有人能给我建议少于 4k 行代码的东西。

所以如果有人知道更简单的解决方案,我将不胜感激。

谢谢。

这个概念叫做整理。您可以查找概念以了解更多信息。例如,Oracle/Sun有一个关于这个概念的教程:

https://docs.oracle.com/javase/tutorial/i18n/text/rule.html

你为此使用 Collator。整理器是 Java 处理国际化比较的方式。

List<String> mylist = ...;
Locale croatian = new Locale("hr", "HR");
// Put whatever Locale you need as the argument to the getInstance method.
Collator collator = Collator.getInstance(croatian);
Collections.sort(mylist, collator);

Local 不仅是 "language",还有许多其他约定。同一语言可能会根据国家或地区或国家内的惯例进行不同的排序 - 这就是为什么 Locale 最多由 3 个部分标识的原因:"country"、"region" 和 "variant".