2017-04-19 12 views
2

私はペルシア語でアイテムのリストを持っており、アルファベット順にソートしたいと思っています。
私はjavaがペルシア語のアルファベット順のソートを正しくサポートしていないと理解しています。
arraylistをアルファベット順に並べ替え(ペルシア語)

マイコード:

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 ''ロケールが含まれているかどうか確認できます。 –

+1

残念ながら、ロケールは[サポートされていません](http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html#util-text)のように見えます。それが価値のあるものについては、通常、Collat​​orの強さを設定する必要はありません。ロケールがサポートされている場合は、デフォルトの強さで正しくソートされます。 – VGR

+0

@ThomasFritschこのソリューションは正しく動作します。とにかくありがとうございました – hosseinAmini

1

これは古いです(Java 1.4以降)。ただし未解決の拡張要求です。 バグレポートJDK-6182989 - Collator should support the correct sort order for Persianを参照してください。 しかし、あなたはただそこに与えられたPersianCollatorために提案されたコードをコピーして、このようにそれを使用することができますことがあります

Collections.sort(items, PersianCollator.persianCollator()); 
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ドキュメントのクラスの説明には良い例があります。

作成するRuleBasedCollat​​orの使用方法を示すcomplete example in the Java Tutorialsもあります。

関連する問題