2017-04-19 38 views
2

我有一個波斯語項目列表,我想按字母順序對它們進行排序。
據我瞭解,java不支持按波斯語正確排序。
按字母順序排列數組列表(波斯語)

我的代碼:

List<String> items = new ArrayList<>(); 
items.add("آب"); 
items.add("بابا"); 
items.add("تار"); 
items.add("پارک"); 
items.add("توت"); 

Collections.sort(items); 

當我打印此列表中的結果將是:

آب 
بابا 
تار 
توت 
پارک 

但必須是這樣的:

آب 
بابا 
پارک 
تار 
توت 

問題是與這些字母گچپژ
我該如何解決它?

回答

4

在你的問題的代碼中,Java使用unicode命令對字符串進行排序,並且(我必須猜測)這對波斯文沒有幫助。

要正確排序,您可以使用Java提供的Collator功能。

Collator collator = Collator.getInstance(new Locale("fa", "IR")); 
collator.setStrength(Collator.PRIMARY); 
Collections.sort(items, collator); 

雖然我不知道波斯是否受支持。

+0

不幸的是,它不是。你可以用'Collat​​or.getAvailableLocales()'檢查它,看它是否包含''fa''Locale。 –

+1

不幸的是,看起來該語言環境[不支持](http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html#util-text)。對於它的價值,通常沒有必要設置Collat​​or的強度。如果區域設置受支持,它將使用默認強度正確排序。 – VGR

+0

@ThomasFritsch此解決方案可正常工作。不管怎樣,謝謝你 – hosseinAmini

0

此代碼將使預期的結果:

import java.util.*; 

public class Main { 
final static String ORDER = "ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی"; 


public static void main(String[] args) { 
    List<String> items = new ArrayList<String>(); 
    items.add("آب"); 
    items.add("بابا"); 
    items.add("تار"); 
    items.add("پارک"); 
    items.add("توت"); 

    Collections.sort(items, new Comparator<String>() { 
     @Override 
     public int compare(String o2, String o1) { 
      return ORDER.indexOf(o2.charAt(0)) - 
      ORDER.indexOf(o1.charAt(0)); 
     } 
    }); 

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

} 

} 

它排序按首字母只要。以其他字母命令,比較方法應相應改進。

0

不知道您使用的是哪個版本的Java,但可以使用簡單的RuleBasedCollator來切換需要切換的少數字符的順序(其餘應遵循Unicode順序)。在API文檔中對類的描述中有一個很好的例子。

還有一個complete example in the Java Tutorials顯示如何使用您創建的RuleBasedCollat​​or。