微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在java中以Unicode代码点UTF8或UTF32排序顺序排序?

如何解决如何在java中以Unicode代码点UTF8或UTF32排序顺序排序?

Java 的 String.compareto 使用 UTF16 排序顺序。

List<String> inputValues = Arrays.asList("?","figure","flagship","zion");
Collections.sort(inputValues);

以上代码按顺序排序[zion,?,figure,flagship] 但是,我希望此排序顺序为 [zion,flagship,?] 请注意,有些字符是连字。

解决方法

[也许不是每个人都注意到,显示为大写的 A 实际上是:

Mathematical Italic Capital A (U+1D434)

]

您的问题是在 Java 中超出 BMP 的字符被编码为两个字符。

要根据代码点字典顺序对列表进行排序,您需要定义自己的 Comparator

public class CodePointComparator implements Comparator<String> {
 @Override
 public int compare(String o1,String o2) {
    int len1 = o1.length();
    int len2 = o2.length();
    int lim = Math.min(len1,len2);
    int k = 0;
    while (k < lim) {
      char c1 = o1.charAt(k);
      char c2 = o2.charAt(k);
      if (c1 != c2) {
        // A high surrogate is greater than a non-surrogate character
        if (Character.isHighSurrogate(c1) != Character.isHighSurrogate(c2)) {
          return Character.isHighSurrogate(c1) ? 1 : -1;
        }
        return c1 - c2;
      }
      k++;
    }
    return len1 - len2;
  }
}

并将其作为参数传递给 List#sort 方法。我直接对代理对进行操作以获得一些性能。

,

抱歉,我不是在寻找字典排序,而是简单地根据 Unicode 代码点(UTF-8 或 UTF-32)进行排序。

在我尝试使用的库之一中有一条评论:

输入值(键)。这些必须以 Unicode 代码点(UTF8 或 UTF32)排序顺序提供给 Builder。请注意,按 Java 的 String.compareTo(UTF16 排序顺序)进行排序是不正确的,并且在构建 FST 时可能会导致异常

我遇到了问题,因为我使用了 Collections.sort,这是 Java 的 UTF-16 排序顺序。最后,我编写了自己的比较函数,如下所示,它解决了我面临的问题。我很惊讶它在本机或其他一些流行的库中不可用。

public static void sort(List<String> list) {
    Collections.sort(
            list,new Comparator<String>() {
                @Override
                public int compare(String s1,String s2) {
                    int n1 = s1.length();
                    int n2 = s2.length();
                    int min = Math.min(n1,n2);
                    for (int i = 0; i < min; i++) {
                        int c1 = s1.codePointAt(i);
                        int c2 = s2.codePointAt(i);
                        if (c1 != c2) {
                            return c1 - c2;
                        }
                    }
                    return n1 - n2;
                }
            });
}
,

最简单的方法:

inputValues.sort(String.CASE_INSENSITIVE_ORDER.reversed());



很少完成但有更多控制:

将列表转换为数组:

String[] arr = new String[inputValues .size()]; 
for (int i =0; i < inputValues .size(); i++) 
    arr[i] = inputValues.get(i); 

还有其他有效的方法可以将 List 转换为数组,但这很容易理解!

然后使用这个函数:

 public static String[] textSort(String[] words) {
    for (int i = 0; i < words.length; i++) {
        for (int j = i + 1; j < words.length; j++) {
            if (words[i].toUpperCase().compareTo(words[j].toUpperCase()) < 0) {//change this to > if you want to sort reverse order
                String temp = words[i];
                words[i] = words[j];
                words[j] = temp;
            }
        }
    }

    return words;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?