我正在练习示例面试问题,其中一个是: “实现一种算法来确定字符串是否具有所有唯一字符”。
当我们假设是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)
但我不知道在这种情况下如何解决这个难题,我该如何处理这些代理对?
谢谢!
答案 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...
}