实现一个算法来确定一个字符串是否具有所有唯一字符(字符大于U + FFFF)

时间:2016-04-26 17:30:23

标签: java string unicode

我正在练习示例面试问题,其中一个是: “实现一种算法来确定字符串是否具有所有唯一字符”。

当我们假设是ASCII / ANSI时,这很容易。 implement-an-algorithm-to-determine-if-a-string-has-all-unique-charact

但我的问题是:如果我们说字符串可以包含例如,那该怎么办?象形文字符号或其他(代码点大于U + FFFF ......?)。

因此,如果我理解正确的话,如果给定字符串包含属于从U + 0000到U + FFFF的字符集的字符,我可以很容易地想到解决方案 - 它们可以转换为16位字符,但是如果我遇到一个代码点大于U + FFFF ......的角色?

  

代码点大于U + FFFF的字符称为增补字符。 Java平台在char数组和String和StringBuffer类中使用UTF-16表示。在此表示中,补充字符表示为一对char值,第一个来自高代理范围(\ uD800- \ uDBFF),第二个来自低代理范围(\ uDC00- \ uDFFF)

但我不知道在这种情况下如何解决这个难题,我该如何处理这些代理对?

谢谢!

1 个答案:

答案 0 :(得分:2)

Java 8有CharSequence#codePoints method,它在字符串中生成IntStream个Unicode代码点。从那里开始,只需要编写代码来测试IntStream中元素的唯一性。

如果您仍然使用Java 7或更低版​​本,那么可以使用基于代码点的方法来解决此问题,但它们使用起来要复杂得多。您必须循环遍历字符串的char并检查每个字符串的值,以判断您是否正在处理代理项对。像(彻底未经测试)的东西:

for (int i = 0; i < str.length(); i++) {
    int codepoint = str.codePointAt(i++);
    if (Character.isHighSurrogate(str.charAt(i))) {
        // This will fail if the UTF-16 representation of 
        // this string is wrong (e.g., high surrogate `char` 
        // at the end of the string's `char[]`).
        i += 1;
    }
    // do stuff with codepoint...
}