如何按字符串值(波斯字母)对List <object>进行排序?

时间:2016-06-12 08:02:46

标签: java android

我有一个带有两个字段的学生列表(名称和编号),我想按名称(波斯名称)对列表进行排序,但是当我使用 Collections.sort 对列表进行排序时,一些波斯语字母的问题,如“ک”&amp; “گ”&amp; “ژ”&amp; ......    结果是:“ی”,“ک”,“م”    但它必须是:“ی”,“م”,“ک”

这是我的代码:

 public class Student {
    private String name;
    private int number;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", number=" + number +
                '}';
    }

}

public class Main {

    public static void main(String[] args) {

            List<Student> studentList = new ArrayList<Student>();

            Student temp1 = new Student();
            temp1.setName("ی");
            temp1.setNumber(5);

            Student temp2 = new Student();
            temp2.setName("م");
            temp2.setNumber(4);

            Student temp3 = new Student();
            temp3.setName("ک");
            temp3.setNumber(3);

            studentList.add(temp1);
            studentList.add(temp2);
            studentList.add(temp3);

            // before sort
            System.out.println("before sort");
            for(Student student : studentList){
                    System.out.println("Student name: " + student.getName());
            }

            Locale locale = new Locale("fa");

            System.out.println("--------------------");
            System.out.println("Language: " + locale.getDisplayLanguage());
            System.out.println("--------------------");

            if (studentList.size() > 0) {
                    Collections.sort(studentList, new Comparator<Student>() {
                            @Override
                            public int compare(final Student object1, final Student object2) {
                                    return Collator.getInstance(locale).compare(object1.getName(), object2.getName());
                            }
                    } );
            }

            // after sort
            System.out.println("after sort");
            for(Student student : studentList){
                    System.out.println("Student name: " + student.getName());
            }

    }

}

4 个答案:

答案 0 :(得分:2)

您可以使用整理器,看一下:

Performing Locale-Independent Comparisons

Sorting arabic words in java

或者创建自己的比较器。这里是文档。

Object Ordering

您获取以这种方式排序的字符串的原因是字符串使用UTF-16 char表进行排序。所以在UTF-16中,这些字符是:

  • 阿拉伯语字母MEEM(U + 0645)
  • ک阿拉伯语字母KEHEH(U + 06A9)
  • ی阿拉伯文字母FARSI YEH(U + 06CC)

答案 1 :(得分:1)

将Collat​​or用于&#34; IR&#34; :

Collator.getInstance(new Locale("fa", "IR")).compare ...

答案 2 :(得分:0)

如果JDK中没有这样的Locale,很可能有人已经为Java编写了这样的库。我没有找到任何图书馆,但也许你可以在你懂语言的时候找到一个。

答案 3 :(得分:0)

在 G3ntle_Man 的帮助下,如果您使用 Java 8,则可以像这样使用 stream() 来完成

mStringList.stream().sorted(
                        (string1, string2) -> Collator.getInstance(
                                new Locale("fa", "IR"))
                                .compare(string1, string2)).collect(Collectors.toList());