说明:这段代码很有意思,它考虑到了 Unicode 的情况,我们如何写反转的话,两头循环,然后交换. 但是这只做了第一步,而 JDK源码中,它考虑到了还原 Unicode 的情况.
/**
* 导致此字符序列被序列的反序替换. 如果序列中包含任何代理对,则将这些代理对视为反向操作的单个字符.
* 因此,高低代理人的顺序永远不会逆转.(也就是说,这个方法将代码点当成了一个整体.)
*
* 在执行 reverse 方法之前,让 n 成为此字符序列的字符长度(不是 char 值中的长度).
* 然后,新字符序列中索引 k 处的字符等于旧字符序列中索引 n-k-1 处的字符.
*
* 请注意,反向操作可能导致在操作之前产生代表对,即未配对的低代理和高代理.
* 例如,反转“\ uDC00 \ uD800”会生成“\ uD800 \ uDC00”,这是一个有效的代理项对.
*
* @return a reference to this object.
*/
public AbstractStringBuilder reverse() {
//是否含代理字符
//高代理highSurrogate和低代理lowSurrogate概念请另查询char与Unicode字符
boolean hasSurrogate = false;
//定义一个变量表示长度-1
int n = count - 1;
//j初始化,长度-2再算术右移一位 j = (count-2)/2
//偶数长度,遍历一半次数,对调替换
//奇数长度,遍历一半-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;
}
分享到:
相关推荐
主要介绍了JS数组方法reverse()用法,结合实例形式分析了JS数组reverse()方法基本功能、用法与操作注意事项,需要的朋友可以参考下
具体分析如下: sort() 方法用于对数组的元素进行排序。 reverse()将数组中的元素逆序 首先我们来试试以下这段代码: 代码如下:var values = [1, 0, 5, 15, 10]; values.reverse(); console.log(values); 输出结果...
Mastering Reverse Engineering
python语言中的列表排序方法有三个:reverse反转/倒序排序、sort正序排序、sorted可以获取排序后的列表。在更高级列表排序中,后两中方法还可以加入条件参数进行排序。 reverse()方法 将列表中元素反转排序,比如...
reverse c++
c++ 的array源码分析和reverse-iterator和-Array-const-iterator类
iOS App ReverseEngineering
CTF逆向(reverse)入门脑图,xmind格式文件。Reverse即逆向工程,题目涉及到软件逆向、破解技术等,要求有较强的反汇编、反编译扎实...主要考查参赛选手的逆向分析能力。 仅供CTF竞赛参考使用,请不要做违法乱纪的事情
电脑没有无线网卡,家里没有无线路由器,公司没有wifi网络时却又想让手机不耗流量上网,畅玩手机网游怎么办... Ps:若长时间无法检测到设备ID,请断开电脑上的手机助手类软件与手机的连接,并尝试重新拔插USB线!6 p- k
Reverse Engineering 逆向工程经典资料
bios reverse engineering collected works !chrysanthemum
reverse.rar 反向连接 教程 源码
Advanced Apple Debugging & Reverse Engineering, Second Edition ISBN: Learn the powerful secrets of Apple’s software debugger, LLDB, that can get more information out of any program than you ever ...
practical reverse engineering
Reverse Engineering for Beginners English Version Reverse Engineering for Beginners English Version
反编译工具Android-reverse
Hibernate_Reverse_Engineering详细描述
即时通讯DWR Reverse Ajax