lastIndexOf(int ch, int fromIndex)方法
lastIndexOf(int ch, int fromIndex)方法
lastIndexOf(int ch)方法
/**
*
* @param ch 一个字符
* @return 返回指定字符的最后一次出现的字符串中的索引
*/
public int lastIndexOf(int ch) {
return lastIndexOf(ch, value.length - 1);
}
/**
*
* @param ch 一个字符
* @param fromIndex 开始搜索的索引
* @return 从fromIndex索引开始最后一次出现ch字符的索引
*/
public int lastIndexOf(int ch, int fromIndex) {
//一般ch都是从0到0xFFFF
if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
final char[] value = this.value;
//比较fromIndex和字符串最后一个字符的索引
//取较小值
//防止fromIndex越界
int i = Math.min(fromIndex, value.length - 1);
//从最后一个索引位置开始向前查找
for (; i >= 0; i--) {
//逐一判断 相等即返回当前索引
if (value[i] == ch) {
return i;
}
}
//找不到即返回-1
return -1;
} else {
//目前不做深究
return lastIndexOfSupplementary(ch, fromIndex);
}
}
lastIndexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex)
/ * @param source 源字符串的数组.
* @param sourceOffset 源字符串的偏移量.
* @param sourceCount 源字符串的长度.
* @param target 子串的数组.
* @param targetOffset 子串偏移量.
* @param targetCount 子串的长度
* @param fromIndex 开始索引的位置
* @return 返回指定子字符串最后一次出现的字符串中的索引。
*/
static int lastIndexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount,
int fromIndex) {
//因为sourceOffset和targetOffset 都为0
//查看源码调用此方法时的参数都为0
//所以最右侧索引位为元字符长度-字串长度
int rightIndex = sourceCount - targetCount;
//开始索引位置小于0则说明找不到
//因为这是从后面往前找的
if (fromIndex < 0) {
return -1;
}
//因为索引位置大于rightIndex肯定找不到
//所以开始索引位置大于rightIndex就从rightIndex查找
if (fromIndex > rightIndex) {
fromIndex = rightIndex;
}
//子串长度为0,则返回源字符串最后一个字符位置的索引
if (targetCount == 0) {
return fromIndex;
}
//子串最后一个字符索引位
int strLastIndex = targetOffset + targetCount - 1;
//获取子串最后一个字符
char strLastChar = target[strLastIndex];
//因为子串和源字符串比较是从子串的最后一个位置向前比较
//min为源字符串source最后一个字符的最小索引位置
int min = sourceOffset + targetCount - 1;
//因为有fromIndex ,所以源字符串source的最小索引为min+fromIndex
int i = min + fromIndex;
//此时i为源字符串source的最后一个位置最大索引位置
startSearchForLastChar:
while (true) {
//循环找到最后一个字符相等的位置
while (i >= min && source[i] != strLastChar) {
i--;
}
//如果i<min说明找不到 返回-1
if (i < min) {
return -1;
}
//最后一个字符相等的索引找到后
//获取源字符串source倒第二个字符索引位置
int j = i - 1;
//首先明白是倒着比较的
//start为计算源字符串source个字符索引位置的最后一个位置的前一个索引位置
int start = j - (targetCount - 1);
//k为字串倒第二个字符索引位置
int k = strLastIndex - 1;
while (j > start) {
//依次向前比较所有字符
if (source[j--] != target[k--]) {
//如果不想等则向前继续查找倒数第一个字符相等的索引
i--;
continue startSearchForLastChar;
}
}
//找到了返回
//为什么+1
//引文start为计算源字符串source个字符索引位置的最后一个位置的前一个索引位置
return start - sourceOffset + 1;
}
}
文章转载参照:
http://www.516tool.com/java/29.html