2012-02-13 177 views
20

我想排序一个ArrayList<String>但问题是我的母语字符 - 我的字母表是这样的:a, ą, b, c, č, d, e, f ... z, ž。正如你所看到的z字符是从第二个字符,并且ą是字母表中的第二个,所以在我排序我的数组后排序不正确。我所有的母语字符都移动到数组的末尾。例如:Java数组排序UTF-8

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

查看[this question](http://stackoverflow.com/questions/4225523/collat​​or-doesnt-sort-right-for-given-locale) – 2012-02-13 13:27:13

回答

22

您应该使用Collator类。

例如

Locale lithuanian = new Locale("lt_LT"); 
Collator lithuanianCollator = Collator.getInstance(lithuanian); 

,然后使用该校验器

Collections.sort(theList, lithuanianCollator); 
+0

我的国家是立陶宛,语言是立陶宛语,我该怎么办,因为如果我是正确的,我的语言不支持Locale类? – Minutis 2012-02-13 13:39:25

+2

这个答案是正确的,但没有必要创建一个Comparator - Collat​​or已经是Comparator的一个实例。 Collections.sort(myList,Collat​​or.getInstance(Locale.FRENCH));是完整的代码。 – 2012-02-13 13:43:59

+1

'Collat​​or' **是设计用的一个**比较器。创建另一个“比较器”是不必要的。 – 2012-02-13 13:44:41

5

分类收集可以使用Collator做语言环境敏感字符串comparisions。

+0

谢谢,但上面的答案更加完善,以为你是对的。 – Minutis 2012-02-13 13:56:52