大家好,欢迎来到IT知识分享网。
最近在解决android 中listview的查找问题,用到了indexOf 方法,仔细看了下源码,详解如下。
private static int indexOf(String source, String target, int fromIndex) {
final int sourceLength = source.length();
final int targetLength = target.length();
//1、当开始查找位置 大于等于 源字符串长度时,如果[查找字符串]为空,则:
//返回字符串的长度,否则返回-1.
if (fromIndex >= sourceLength) {
return (targetLength == 0 ? sourceLength : -1);
}
//2、如果fromIndex 小于 0,则从 0开始查找。
if (fromIndex < 0) {
fromIndex = 0;
}
//3、如果[查找字符串]为空,则返回fromIndex
if (targetLength == 0) {
return fromIndex;
}
//4、开始查找,从[查找字符串]中得到第一个字符,标记为first
char first = target.charAt(0);
//4.1、计算出源字符串最大开始查找的位置
int max = (sourceLength - targetLength);
//4.2、遍历查找
for (int i = fromIndex; i <= max; i++) {
/* Look for first character. */
//4.2.1、从[源字符串]中,查找到目标字符串每个字母的 first 的位置,找不到直接返回-1结束
if (source.charAt(i)!= first) {
while (++i <= max && source.charAt(i) != first);
}
/* Found first character, now look at the rest of v2 */
//4.2.2、如果在[源字符串]中,找到首个[目标字符串],则开始匹配整个[目标字符串]
if (i <= max) {
//4.2.2.1、得到下一个要匹配的位置,标记为j
int j = i + 1;
//4.2.2.2、得到其余[目标字符串]的长度,标记为end,当j=end时表示目标字符串匹配完成
int end = j + targetLength - 1;
//4.2.2.3、遍历,其余[目标字符串],从k开始,
//如果j不越界(小于end,表示:其余[目标字符串]的范围),
//同时[源字符串]==[目标字符串],则
//自增,继续查找匹配。直至完成所有匹配
for (int k = 1; j < end && source.charAt(j)== target.charAt(k); j++, k++);
//4.2.2.4、如果j与end相等,则表示:
//源字符串中匹配到目标字符串,匹配结束,返回i。
if (j == end) {
/* Found whole string. */
return i;
}
}
}
//其余情况,返回-1.表示没有匹配到目标字符串
return -1;
}
一、indexOf函数简介
indexOf是String.java中的一个方法,用于返回[目标字符串]在[源字符串]中的位置。
1、indexOf:返回特定子字符串第一次在源字符串中的位置。如果源字符中不存在目标字符,则返回-1。
二、indexOf函数两种用法和实现功能说明
1、 indexOf(String str): 返回指定字符str在字符串中(方法调用者)第一次出现处的起始索引,如果此字符串中没有这样的字符,则返回 -1。
2、indexOf(String str, int index): 返回从 index 位置开始查找指定字符str在字符串中第一次出现处的起始索引,如果此字符串中没有这样的字符,则返回 -1。
举例说明:
String str = "01234567890123456789";
System.out.println(str.indexOf("123"));
System.out.println(str.indexOf("123",5));
上面程序的结果为1和11。第1个输出函数中的indexOf()方法只有一个参数,故返回123在str中第一次出现处的索引,为1;第1个输出函数中的indexOf()方法有两个参数,第一个参数为要查找的字符串123,第2个参数为从第5所以位置处开始查找,故只能查找到str中的第2个123,返回其出现的起始索引,为11。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/26344.html