我研究选择排序算法。考虑这个实现:
http://algs4.cs.princeton.edu/21elementary/Selection.java.html
我有一个文本文件,其中包含类似的unicode字样。
$ more words.txt
şeftali içel ırak üzüm uzun çorba çimen ufuk
当我运行程序时,它没有正确排序unicode字符。
$ java-algs4 Selection < words.txt
içel
ufuk
uzun
çimen
çorba
üzüm
ırak
şeftali
我的第一次尝试是使用整理器。
import java.util.*;
import java.text.*;
public class StringSorter
{
public static void sortStrings(Collator c, String[] words)
{
String tmp;
for (int i = 0; i < words.length; ++i)
{
for (int j = 0; j < words.length; ++j)
{
if (c.compare(words[i], words[j]) < 0)
{
tmp = words[i];
words[i] = words[j];
words[j] = tmp;
}
}
}
}
public static void printStrings(String[] words)
{
for (int i = 0; i < words.length; ++i)
{
System.out.println(words[i]);
}
}
public static void main(String[] args)
{
Collator tr_TRCollator = Collator.getInstance(new Locale("tr", "TR"));
String[] words = {"şeftali", "içel", "ırak", "üzüm", "uzun", "çorba", "çimen", "ufuk"};
sortStrings(tr_TRCollator, words);
printStrings(words);
}
}
此程序按预期正确排序单词。
$ java-algs4 StringSorter
çimen
çorba
ırak
içel
şeftali
ufuk
uzun
üzüm
我的问题是我们应该如何在Java中实现unicode感知选择排序算法?
此外,Selection.class sort方法将Comparator对象作为第二个参数。是否可以编写我们自己的Comparator接口实现,以便它能够正确地对unicode元素进行排序。
public static void sort(Object[] a, Comparator c)
任何帮助将不胜感激。感谢..
答案 0 :(得分:1)
Collator
类实现Comparator
界面,因此您只需将tr_TRCollator
传递给Selection.sort
作为第二个参数。
答案 1 :(得分:0)
你可以规范化字符串并进行unicode比较,如果它们完全匹配的话。
String[] words = "şeftali içel ırak üzüm uzun çorba çimen ufuk".split(" ");
Arrays.sort(words, Comparator.comparing((String w) ->
Normalizer.normalize(w, Normalizer.Form.NFD))
.thenComparing(Comparator.naturalOrder()));
Stream.of(words).forEach(System.out::println);
打印
çimen
çorba
içel
şeftali
ufuk
uzun
üzüm
ırak
这是关闭但不会将ı
视为i
答案 2 :(得分:0)
重要的一点是,您的第二个示例使用区域设置。字符串的排序顺序取决于语言环境,与字符的unicode代码点无关。即使使用相同语言的国家,例如奥地利,德国和瑞士,在字符串排序顺序方面也存在细微差别。