/*
* 返回指定字符第一次出现的字符串内的索引
*/
public int indexOf(int ch) {
return indexOf(ch, 0);
} /*
* 返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索
* 其中Character.MIN_SUPPLEMENTARY_CODE_POINT是指字符是小于两个字节的
*/
public int indexOf(int ch, int fromIndex) {
final int max = value.length;
if (fromIndex < 0) {
fromIndex = 0;
} else if (fromIndex >= max) {
// Note: fromIndex might be near -1>>>1.
return -1;
} if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
// //在这里处理大多数情况(ch是BMP代码点或是一个无效代码点)
final char[] value = this.value;
for (int i = fromIndex; i < max; i++) {
if (value[i] == ch) {
return i;
}
}
return -1;
} else {
return indexOfSupplementary(ch, fromIndex);
}
} /*
* private修饰的私有方法,主要用于处理大于Character.MIN_SUPPLEMENTARY_CODE_POINT的字符
* 因为在String类中会多次使用,所以封装为私有方法
*/
private int indexOfSupplementary(int ch, int fromIndex) {
if (Character.isValidCodePoint(ch)) {
final char[] value = this.value;
final char hi = Character.highSurrogate(ch);
final char lo = Character.lowSurrogate(ch);
final int max = value.length - 1;
for (int i = fromIndex; i < max; i++) {
if (value[i] == hi && value[i + 1] == lo) {
return i;
}
}
}
return -1;
} /*
* 返回指定字符的最后一次出现的字符串中的索引
*/
public int lastIndexOf(int ch) {
return lastIndexOf(ch, value.length - 1);
} /*
* 返回指定字符的最后一次出现的字符串中的索引,若指定索引就是从指定的索引开始向前搜索的第一个。
* 若无指定索引,就是从最后一个字符向前搜索到的第一个该字符
*/
public int lastIndexOf(int ch, int fromIndex) {
if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
final char[] value = this.value;
int i = Math.min(fromIndex, value.length - 1);
for (; i >= 0; i--) {
if (value[i] == ch) {
return i;
}
}
return -1;
} else {
return lastIndexOfSupplementary(ch, fromIndex);
}
} /*
* 同上一个私有方法,这个用于处理lastIndexOf的非BMP代码点
*/
private int lastIndexOfSupplementary(int ch, int fromIndex) {
if (Character.isValidCodePoint(ch)) {
final char[] value = this.value;
char hi = Character.highSurrogate(ch);
char lo = Character.lowSurrogate(ch);
int i = Math.min(fromIndex, value.length - 2);
for (; i >= 0; i--) {
if (value[i] == hi && value[i + 1] == lo) {
return i;
}
}
}
return -1;
} /*
* 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。,若不指定索引就是从下标0开始。
* 方法具体类似于返回指定字符的索引,这个方法返回的是指定字符串中的第一个字符的下标
*/
public int indexOf(String str) {
return indexOf(str, 0);
} /*
*
*/
public int indexOf(String str, int fromIndex) {
return indexOf(value, 0, value.length, str.value, 0, str.value.length, fromIndex);
} /*
*
*/
static int indexOf(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex) {
return indexOf(source, sourceOffset, sourceCount, target.value, 0, target.value.length, fromIndex);
}
static int indexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset,
int targetCount, int fromIndex) {
if (fromIndex >= sourceCount) {
return (targetCount == 0 ? sourceCount : -1);
}
if (fromIndex < 0) {
fromIndex = 0;
}
if (targetCount == 0) {
return fromIndex;
} char first = target[targetOffset];
int max = sourceOffset + (sourceCount - targetCount); for (int i = sourceOffset + fromIndex; i <= max; i++) {
/* Look for first character. */
if (source[i] != first) {
while (++i <= max && source[i] != first)
;
} /* Found first character, now look at the rest of v2 */
if (i <= max) {
int j = i + 1;
int end = j + targetCount - 1;
for (int k = targetOffset + 1; j < end && source[j] == target[k]; j++, k++)
; if (j == end) {
/* Found whole string. */
return i - sourceOffset;
}
}
}
return -1;
} /*
*
*/
public int lastIndexOf(String str) {
return lastIndexOf(str, value.length);
} public int lastIndexOf(String str, int fromIndex) {
return lastIndexOf(value, 0, value.length, str.value, 0, str.value.length, fromIndex);
}
/*
*
*/
static int lastIndexOf(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex) {
return lastIndexOf(source, sourceOffset, sourceCount, target.value, 0, target.value.length, fromIndex);
} static int lastIndexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset,
int targetCount, int fromIndex) {
int rightIndex = sourceCount - targetCount;
if (fromIndex < 0) {
return -1;
}
if (fromIndex > rightIndex) {
fromIndex = rightIndex;
}
/* Empty string always matches. */
if (targetCount == 0) {
return fromIndex;
} int strLastIndex = targetOffset + targetCount - 1;
char strLastChar = target[strLastIndex];
int min = sourceOffset + targetCount - 1;
int i = min + fromIndex; startSearchForLastChar: while (true) {
while (i >= min && source[i] != strLastChar) {
i--;
}
if (i < min) {
return -1;
}
int j = i - 1;
int start = j - (targetCount - 1);
int k = strLastIndex - 1; while (j > start) {
if (source[j--] != target[k--]) {
i--;
continue startSearchForLastChar;
}
}
return start - sourceOffset + 1;
}
}

最新文章

  1. Android-Eclipse-INSTALL_FAILED_UPDATE_INCOMPATIBLE错误
  2. 解决:eclipse 非正常关闭,导致无法正常启动
  3. gawk快速入门
  4. T-SQL的回车和换行符(SQL)
  5. MySQL数据备份小结
  6. 剖析OkHttp缓存机制
  7. Linux下文件的三个时间(Atime,Mtime,Ctime)
  8. JVM的参数设置与OutOfMemoryError异常关系
  9. Unity3D 之连按移动加速
  10. python学习笔记--Django入门一 网页显示时间
  11. 一、mysql分表简单介绍
  12. vs在线工具杂烩
  13. android 多媒体数据库详解
  14. oracle一视图性能问题
  15. Python科学计算之Pandas
  16. iOS开发之自定义UITableView的cell
  17. Python---老王开枪
  18. [Swift]LeetCode413. 等差数列划分 | Arithmetic Slices
  19. sql 中 and 和 or的坑
  20. linux centos7下源码 tar安装mysql5.7.23(5.7以上均可试用)

热门文章

  1. https学习笔记
  2. qt的应用层主要是大型3d,vr,管理软件和器械嵌入软件(有上千个下一代软件黑科技项目是qt的,美国宇航局,欧洲宇航局,超级战舰DDG1000)
  3. Leetcode 258 Add Digits数论
  4. WPF 3D编程介绍
  5. Mac OS X通过结合80port
  6. 安装在谷歌axure小工具
  7. docker include not found: networks
  8. AngularJS 多级下拉框
  9. WPF CommandParameter的使用
  10. Centos上通过shell脚本实现数据库备份和还原