Java按照代码点(UTF-32)顺序对字符串进行排序。

3
除了将其转换为UTF-8字节或编写一个迭代和比较的比较函数之外,在JDK 1.6中是否有一些我错过的方法可以按完整的Unicode码点顺序而不是UCS-2码点顺序比较两个字符串?
我知道编写这样的代码并不难。然而,我很困惑1.6在java.lang.String中具有各种“codepoint”API以及排序系统,但显然没有简单地比较两个字符串而不会在代理项上出现问题的方法。
为了回应评论者,我必须向工具提供一些以此顺序排列的字符串数据。

默认情况下它已经这样做了?或者你是真的想在排序中考虑到变音符号吗?例如aaab而不是(默认)aaab?否则我看不出这个问题的任何理由 :) - BalusC
String.compareTo 在 Sun 的 JVM 1.6.0_16 中至少被实现为包含字符的比较。如果字符串包含 BMP 之外的字符代理对,则无法满足 bmargulies 的要求。 - jarnbjo
实际上,API文档中已经描述了这种行为,因此将compareTo基于char值作为实现细节并不是Sun的VM的问题。 - jarnbjo
1
在当前的Java 1.8/1.9 API中是否已经有了解决方案?或者可能在某个库中找到? - Rolch2015
2个回答

1
据我所知,该API没有这样的方法,但自己实现应该很容易。只是出于好奇:您需要这样的东西是做什么用的?

0
为了完整起见,这是我对问题的解决方案。也许有更好的解决方案:
   String sortedText = text
      .codePoints()
      .sorted()
      .mapToObj(i -> String.valueOf(Character.toChars(i)))
      .collect(Collectors.joining(""));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接