我有一个带有两个字段的学生列表(名称和编号),我想按名称(波斯名称)对列表进行排序,但是当我使用 Collections.sort 对列表进行排序时,一些波斯语字母的问题,如“ک”& “گ”& “ژ”& ...... 结果是:“ی”,“ک”,“م” 但它必须是:“ی”,“م”,“ک”
这是我的代码:
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());
}
}
}
答案 0 :(得分:2)
您可以使用整理器,看一下:
Performing Locale-Independent Comparisons
或者创建自己的比较器。这里是文档。
您获取以这种方式排序的字符串的原因是字符串使用UTF-16 char表进行排序。所以在UTF-16中,这些字符是:
答案 1 :(得分:1)
将Collator用于&#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());