2015-07-21 22 views
4

我有一個字符序列列表。我需要按照自然的順序排列它們。我用Java編碼。 我最初的想法是使用Collections.sort()。但我認爲這種方法遵循分隔小寫和大寫文本的ASCII順序。這不是一個自然的流程。在Java中使用字母數字數據(和特殊字符)對大小寫不敏感的數據進行排序

試圖定義「自然排序」我做了一個快速搜索,發現似乎解決這個問題的NISO TR03-1999標準。

所以我想我需要一種方法來使用該標準中定義的算法進行排序。 Java中有這樣的功能嗎?或者我需要自己實現它?

我在這裏忽略了什麼嗎?

過去有沒有人有類似的問題?你是怎麼處理的 ?

下面是一個代碼示例測試Collections.sort():

List<String> list = new ArrayList<String>(); 

list.add("z"); 
list.add("a"); 
list.add("Z"); 
list.add("A"); 
list.add("z 1"); 
list.add("a 1"); 
list.add("Z 1"); 
list.add("A 1"); 
list.add(" space"); 
list.add("!"); 
list.add("."); 
list.add(";"); 
list.add("\\"); 
list.add("/"); 
list.add("+"); 
list.add("1"); 
list.add("2"); 
list.add("10"); 
list.add("1abc"); 
list.add("2abc"); 
list.add("10abc"); 

Collections.sort(list); 

for (String string : list) 
    System.out.println(string); 
+0

在java 8中,使用:Collections.sort(list,String :: compareToIgnoreCase); – Kachna

回答

1

可以作出這樣的比較,並忽略大小寫自己的比較類。

static class StringCompare implements Comparator<String> {    
    public int compare(String s1, String s2){ 
     return s1.toLowerCase().compareTo(s2.toLowerCase()); 
    } 
} 

然後用此排序:

Collections.sort(list, new StringCompare()); 
+0

這將解決大小寫敏感問題,但不會解決其他問題,如口音(帶有重音的語言)和其他一些問題,除非我實現了一個巨大的解決方案... –

+0

此外,這個類是完全多餘的,因爲這樣的比較器已存在:[java.lang.String.CASE_INSENSITIVE_ORDER](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#CASE_INSENSITIVE_ORDER)。 – Roman

1

使用Apache常見StringUtils的比較器實現:

class StringCompare implements Comparator<String> {    
    public int compare(String s1, String s2){ 
     return StringUtils.stripAccents(s1.toLowerCase()).compareTo(StringUtils.stripAccents(s2.toLowerCase())); 
    } 
} 
相關問題