首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中实现unicode感知选择排序算法

如何在Java中实现unicode感知选择排序算法
EN

Stack Overflow用户
提问于 2016-02-24 12:53:25
回答 3查看 147关注 0票数 1

研究了选择排序算法。考虑这一执行:

http://algs4.cs.princeton.edu/21elementary/Selection.java.html

我有一个文本文件,里面有这样的unicode单词。

代码语言:javascript
复制
$ more words.txt
şeftali içel ırak üzüm uzun çorba çimen ufuk

当我运行这个程序时,它不能正确地排序unicode字符。

代码语言:javascript
复制
$ java-algs4 Selection < words.txt
içel
ufuk
uzun
çimen
çorba
üzüm
ırak
şeftali

我的第一次尝试是使用校对器。

代码语言:javascript
复制
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);
    }

}

这个程序按预期正确地排序单词。

代码语言:javascript
复制
$ java-algs4 StringSorter
çimen
çorba
ırak
içel
şeftali
ufuk
uzun
üzüm

我的问题是我们应该如何在Java中实现unicode感知的选择排序算法?

另外,Selection.class排序方法将比较器对象作为第二个参数。是否可以编写我们自己的比较器接口实现,以便它能够正确地排序unicode元素。

代码语言:javascript
复制
 public static void sort(Object[] a, Comparator c)

任何帮助都将不胜感激。谢谢..

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-24 13:32:25

Collator类实现了Comparator接口,因此您可以将tr_TRCollator作为第二个参数传递给Selection.sort

票数 1
EN

Stack Overflow用户

发布于 2016-02-24 13:07:48

您可以将字符串规范化,并进行unicode比较,如果它们是其他明智匹配的话。

代码语言:javascript
复制
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);

版画

代码语言:javascript
复制
çimen
çorba
içel
şeftali
ufuk
uzun
üzüm
ırak

这是近在咫尺,但它并不认为ıi

票数 0
EN

Stack Overflow用户

发布于 2016-02-24 13:08:33

重要的一点是,您的第二个示例使用区域设置。字符串的排序顺序与区域设置有关,与字符的unicode编码点无关。即使是使用相同语言的国家,比如奥地利、德国和瑞士,在字符串排序顺序上也有细微的差异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35602782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档