Java数组排序UTF-8

20

我想对一个 ArrayList<String> 进行排序,但问题是我的母语字符 - 我的字母表长这样:a, ą, b, c, č, d, e, f ... z, ž。如你所见,z 字符靠近末尾,而ą在字母表中排名第二,因此当我对数组进行排序后,排序结果不正确。所有我的母语字符都被移到了数组的末尾。例如:

package lt;

import java.util.ArrayList;
import java.util.Collections;

public class test {
    public static void main(String[] args) {
        List<String> items = new ArrayList<>();
        items.add("bbc");
        items.add("ąbc");
        items.add("abc");
        items.add("zzz");

        System.out.println("Unsorted: ");
        for(String str : items) {
            System.out.println(str);
        }

        Collections.sort(items);
        System.out.println();

        System.out.println("Sorted: ");
        for(String str : items) {
            System.out.println(str);
        }
    }
}

输出:

Unsorted: 
bbc
ąbc
abc
zzz

Sorted: 
abc
bbc
zzz
ąbc
应该是:
Sorted:
abc
ąbc
bbc
zzz

1
请查看此问题 - Piotr Praszmo
2个回答

23
你应该使用Collator类。
例如:
Locale lithuanian = new Locale("lt_LT");
Collator lithuanianCollator = Collator.getInstance(lithuanian);

然后使用这个排序器对集合进行排序

Collections.sort(theList, lithuanianCollator);

我的国家是立陶宛,语言是立陶宛语,我该怎么办呢?因为如果我没记错的话,Locale类不支持我的语言。 - Minutis
3
这个回答是正确的,但是没有必要创建一个比较器 —— Collator 已经是 Comparator 的一个实例。 Collections.sort(myList, Collator.getInstance(Locale.FRENCH)); 是完整的代码。 - Sean Reilly
1
按设计,Collator 是一个 Comparator。创建另一个 Comparator 是不必要的。 - Buhake Sindi
3
如果你使用的语言不受Locale支持,那么你会遇到麻烦。幸运的是,根据这个链接:http://www.oracle.com/technetwork/java/javase/javase7locales-334809.html,在Java 7中Lithuanian被Locale支持。由于没有常量,你需要自己构建Locale实例:Locale lithuanian = new Locale("lt_LT"); - Sean Reilly
@SeanReilly,谢谢,我不知道。Minutis - 请看Sean的回答。 - Vic
显示剩余2条评论

5
你可以使用 Collator 来进行本地化敏感的字符串比较。

谢谢,但上面的答案更完善,虽然你说得也对。 - Minutis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接