按字母顺序排序ArrayList(波斯语)

7
我有一个波斯语条目列表,我想按字母顺序对它们进行排序。 据我所知,Java不支持正确的波斯字母表排序。
我的代码:
List<String> items = new ArrayList<>();
items.add("آب");
items.add("بابا");
items.add("تار");
items.add("پارک");
items.add("توت");

Collections.sort(items);

当我打印这个列表时,结果会是:
آب
بابا
تار
توت
پارک

但是必须是这样的:
آب
بابا
پارک
تار
توت

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

6个回答

10

在您提出的代码中,Java使用Unicode顺序对字符串进行排序(我不得不猜测),这对波斯语并不有用。

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

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

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

很遗憾,它不是。您可以使用Collator.getAvailableLocales()进行检查,并查看是否包含“fa”区域设置。 - Thomas Fritsch
1
看起来该地区不受支持,很遗憾。不过,通常情况下不需要设置 Collator 的强度。如果该地区得到支持,则默认强度可以正确排序。 - VGR
@ThomasFritsch 这个解决方案是正确的。不过还是谢谢你。 - hosseinAmini

4

这段代码将会产生预期的结果:

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

1

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

Java教程中也有完整的示例,展示了如何使用您创建的RuleBasedCollator。


1

0
如果您有一个对象的ArrayList,您可以使用这个方法:
首先创建一个Collator:
val collator: Collator = Collator.getInstance(Locale("fa", "IR"))
collator.strength = Collator.PRIMARY

然后通过sortedBy对您的列表进行排序,就像这样:
val sortList = items.sortedWith(compareBy (collator){ it.name})

那个items是你的对象数组列表,而它的name属性则是你的比较器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接