【问题标题】:Sorting arraylist in alphabetical order(Persian)按字母顺序排序arraylist(波斯语)
【发布时间】:2017-09-15 18:43:05
【问题描述】:

我有一个波斯语项目列表,我想按字母顺序对它们进行排序。
据我了解,java 不支持正确按波斯字母排序。

我的代码:

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

Collections.sort(items);

当我打印此列表时,结果将是:

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

但一定是这样的:

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

问题在于这些字母 گ چ پ ژ
我该如何解决?

【问题讨论】:

    标签: java list sorting


    【解决方案1】:

    在您问题的代码中,Java 使用 unicode 顺序对字符串进行排序,并且(我不得不猜测)这对波斯语没有帮助。

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

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

    不过,我不知道是否支持波斯语。

    【讨论】:

    • 不幸的是它不是。您可以使用Collator.getAvailableLocales() 检查它是否包含"fa" 语言环境。
    • 不幸的是,该语言环境似乎是not supported。对于它的价值,通常不需要设置 Collat​​or 的强度。如果支持区域设置,它将使用默认强度正确排序。
    • @ThomasFritsch 此解决方案工作正常。还是谢谢你
    【解决方案2】:

    此代码将给出预期结果:

    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);
        }
    
    }
    
    }
    

    仅按首字母排序。按其他字母排序,比较方法应相应改进。

    【讨论】:

      【解决方案3】:

      如果上面的其他解决方案在那里不起作用,您可以使用这个技巧,

      static private String prepareForArabicSort(String text) {
              return text
                      .replaceAll("ی", "ي")
                      .replaceAll("ک", "ك")
                      .replaceAll("گ", "كی")
                      .replaceAll("ژ", "زی")
                      .replaceAll("چ", "جی")
                      .replaceAll("پ", "بی");
      }
      
      Arrays.sort(list, (l, r) -> {
          return prepareForArabicSort(l).compareTo(prepareForArabicSort(r);
      });
      

      【讨论】:

        【解决方案4】:

        不幸的是,这是一个旧的(自 Java 1.4 起),但仍未解决的增强请求。 请参阅错误报告JDK-6182989 - Collator should support the correct sort order for Persian。 但也许你可以只复制那里给出的PersianCollator 的建议代码,然后像这样使用它:

        Collections.sort(items, PersianCollator.persianCollator());
        

        【讨论】:

          【解决方案5】:

          不确定您使用的是什么版本的 Java,但您可以使用简单的RuleBasedCollator 来切换需要切换的几个字符的顺序(其余应遵循 Unicode 顺序)。 API 文档中的类描述中有一个很好的例子。

          还有一个complete example in the Java Tutorials 展示了如何使用您创建的 RuleBasedCollat​​or。

          【讨论】:

            【解决方案6】:

            如果你有一个对象数组列表,你可以使用这个方法

            首先创建一个整理器:

            val collator: Collator = Collator.getInstance(Locale("fa", "IR"))
            collator.strength = Collator.PRIMARY
            

            然后你的列表通过 sortedBy 像这样:

            val sortList = items.sortedWith(compareBy (collator){ it.name})
            

            items 是你的对象数组列表,it.name 是你的比较器

            【讨论】:

              猜你喜欢
              • 2011-01-30
              • 1970-01-01
              • 2017-05-22
              • 2019-02-03
              • 2019-08-02
              • 2012-11-03
              • 1970-01-01
              • 1970-01-01
              • 2013-10-28
              相关资源
              最近更新 更多