Java反转字符串和相关字符编码的问题解决

小鹿Q

小鹿Q

2016-02-19 09:34

下面是个Java反转字符串和相关字符编码的问题解决教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

代码如下:

public String reverse(char[] value){
       for (int i = (value.length - 1) 1; i = 0; i--){
           char temp = value[i];
           value[i] = value[value.length - 1 - i];
           value[value.length - 1 - i] = temp;
       }
       return new String(value);
}

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

这样的代码,在算法方面是没有任何问题的。但是今天在查看StringBuffer源代码的时候发现,其中reverse方法的源代码写的很精妙。源代码如下:
代码如下:

public AbstractStringBuilder reverse() {
    boolean hasSurrogate = false;
    int n = count - 1;
    for (int j = (n-1) 1; j = 0; --j) {
        char temp = value[j];
        char temp2 = value[n - j];
        if (!hasSurrogate) {
       hasSurrogate = (temp = Character.MIN_SURROGATE && temp = Character.MAX_SURROGATE)
           || (temp2 = Character.MIN_SURROGATE && temp2 = Character.MAX_SURROGATE);
         }
         value[j] = temp2;
         value[n - j] = temp;
     }
     if (hasSurrogate) {
         // Reverse back all valid surrogate pairs
          for (int i = 0; i count - 1; i++) {
             char c2 = value[i];
             if (Character.isLowSurrogate(c2)) {
                 char c1 = value[i + 1];
                 if (Character.isHighSurrogate(c1)) {
                 value[i++] = c1;
                 value[i] = c2;
             }
         }
         }
     }
     return this;
 }

这个方法是定义在StringBuffer的父类AbstractStringBuilder中的,所以该方法的返回值是AbstractStringBuilder,在子类中调用的方式如下:
代码如下:

public synchronized StringBuffer reverse() {
    super.reverse();
    return this;
}

从方法的内容来看,源代码中的基本思路是一致的,同样采用遍历一半字符串,然后将每个字符与其对应的字符进行交换。但是有不同之处,就是要判断每个字符是否在Character.MIN_SURROGATE(ud800)和Character.MAX_SURROGATE(udfff)之间。如果发现整个字符串中含有这种情况,则再次从头至尾遍历一次,同时判断value[i]是否满足Character.isLowSurrogate(),如果满足的情况下,继续判断value[i+1]是否满足Character.isHighSurrogate(),如果也满足这种情况,则将第i位和第i+1位的字符互换。可能有的人会疑惑,为什么要这么做,因为Java中的字符已经采用Unicode代码,每个字符可以放下一个汉字。为什么还要这么做?
一个完整的 Unicode 字符叫代码点CodePoint,而一个 Java char 叫 代码单元 code unit。String 对象以UTF-16保存 Unicode 字符,需要用2个字符表示一个超大字符集的汉字,这这种表示方式称之为 Surrogate,第一个字符叫 Surrogate High,第二个就是 Surrogate Low。具体需要注意的事宜如下:
判断一个char是否是Surrogate区的字符,用Character的 isHighSurrogate()/isLowSurrogate()方法即可判断。从两个Surrogate High/Low 字符,返回一个完整的 Unicode CodePoint 用 Character.toCodePoint()/codePointAt()方法。
  一个Code Point,可能需要一个也可能需要两个char表示,因此不能直接使用 CharSequence.length()方法直接返回一个字符串到底有多少个汉字,而需要用String.codePointCount()/Character.codePointCount()。
 要定位字符串中的第N个字符,不能直接将N作为偏移量,而需要从字符串头部依次遍历得到,需要用String/Character.offsetByCodePoints() 方法。
从字符串的当前字符,找到上一个字符,也不能直接用offset-- 实现,而需要用 String.codePointBefore()/Character.codePointBefore(),或用 String/Character.offsetByCodePoints()
 从当前字符,找下一个字符,不能直接用 offset++实现,需要判断当前 CodePoint的长度后,再计算得到,或用String/Character.offsetByCodePoints()。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

Java反转字符串和相关字符编码的问题解决

编程语言 网络编程
Java反转字符串和相关字符编码的问题解决

Mysql5 字符集编码问题解决

编程语言 网络编程
Mysql5 字符集编码问题解决

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

java字符串的合并

编程语言 网络编程
java字符串的合并

java 字符串匹配函数

Web开发
java 字符串匹配函数

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

JAVA及相关字符集编码问题研究

Java JAVA基础
JAVA及相关字符集编码问题研究

复制字符串中的字符

编程语言 网络编程
复制字符串中的字符

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

幸福变质了换一瓶寂寞 - QQ伤感分组

幸福变质了换一瓶寂寞 - QQ伤感分组

解析java中This的用法分析

解析java中This的用法分析
下拉加载更多内容 ↓