A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© barcelona 中级黑马   /  2017-3-17 14:37  /  2689 人查看  /  26 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本人小白一枚,在使用lastIndexOf(String str, int fromIndex)方法时,出现了让我懵逼的问题,特此向大神们求助,现将代码写于下面:
private static void demo6() {
                String str = "asrrdsgrrerr";
                int length1 = str.indexOf("rr",2);
                int length2 = str.lastIndexOf("rr",2);
                int length3 = str.lastIndexOf("rr",3);       
                System.out.println(length1);
                System.out.println(length2);
                System.out.println(length3);
        }
我在测试类main()方法中调用demo6时输出2 2 2 ,我不明白为什么length2等于2,不是应该是-1吗?
源代码截图: http://bbs.itheima.com/forum.php?mod=attachment&aid=MTUxNzY1fDgwMmUzYTJlOTQzZmEyY2ZhYzI4Njg5MTU2MmMwY2M1fDE3MzEwMjI2NTI%3D&request=yes&_f=.png

2.png (6.7 KB, 下载次数: 86)

2.png

26 个回复

倒序浏览
indexof和lastIndexof区别主要是,前者从左到右,后者从右往左。这样子的话,不是输出2/8/8吗,额,我是新手,哈哈
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
vampire-ho 发表于 2017-3-17 15:27
indexof和lastIndexof区别主要是,前者从左到右,后者从右往左。这样子的话,不是输出2/8/8吗,额,我是新 ...

我也是新手,才学.
lastIndexOf(String str, int fromIndex) :返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。参照API的说法,str.lastIndexOf("rr",2)应该从字符串"asrrdsgrrerr"的索引2,即asr的r开始往前搜索,结果过应为-1.而str.lastIndexOf("rr",3)应该从字符串"asrrdsgrrerr"的索引3,即asrr的r开始搜索,可以匹配到给定的字字符串,结果应为2.
回复 使用道具 举报
本帖最后由 Tupurp 于 2017-3-17 22:50 编辑


修改后的,希望管理员给技术分
我看了下源码。大体内容如下:
首先呢lastindexof(str)方法体内部直接只写了一个  return 语句,它返回的是 方法lastindexof(){str,int}
而方法lastindexof(){str,int}内部呢其实还是调用的另外一个方法,这个方法内部呢是用字符数组来实现的,也就是说你所操作的字符

串底层都是用数组来比较的。
那么我们来解释下这个内部是数组实现的方法,是这样定义的
        static int lastIndexOf(//调用方法的那个字符串  char[] source, int sourceOffset, int sourceCount,
           //要比较的子串 char[] target, int targetOffset, int targetCount,
            //  开始比较的位置int fromIndex){方法}
在内部方法呢, 他先判断你子串是不是比母串长,长就直接输出-1
其次,再判断你这个子串是不是空的啊,如果是空的,且你定义的索引位置没有超出我母串的长度,那就输出你的索引,否则输出
母串的最后一个索引角标。
然后他就开始判断了,我在你定义的索引位置的基础上,我加上一个子串最大角标,记作(int+srtlong)吧
判断母串的这个角标位置的字符和子串的最后一个字符是否一样,一样,就判读子串的倒数第二个,依次往后推。
在这个过程中,(比如说啊,子串有六个字符,已经有两个一样了,但是这时候发现和子串倒数第三个字符比较的(int+srtlong)角标位置到了角标1了,那还比个屁啊,肯定不满足啊)
判断完成后,就输出角标位置。
那说这个极端情况:avccksdfkoe   子串是cc,索引位置从母串的角标2开始,那么最开始执行时,这个2会加一个子串的最大角标,在这里就是1,那么就会先判断母串的角标3的位置,是一样的,继续往前判断,最后输出这个角标2;
内部是这样实现的,
那这个功能说返回指定子字符串在此字符串中最后一次出现的索引,从指定的位置索引开始反向搜索。得到len2=2的结果是没错的
在整个字符串中从2角标开始是不是有个cc?是有的,那他是不是从指定位置开始的?也是的,那是不是最后一次出现的索引?也是的。

其实就是要理解从指定位置反向索引这个子字符串,但是这个子字符串的第0角标是可以放在这个索引位置的(因为源码里就是这意思)

而且得到的这个结果确实是最后一次出现在整个字符串中(在定义索引位置开始)
希望能理解吧!

回复 使用道具 举报 1 0
C:\Users\Administrator\Desktop\2.png
回复 使用道具 举报
我还不信传不上来了

2.png (100.23 KB, 下载次数: 46)

我还不信我传不上来了

我还不信我传不上来了
回复 使用道具 举报
Tupurp 发表于 2017-3-17 16:13
因为该方法是从指定索引处反向搜索整个,注意是整个     字符串是否包含子串,它反向搜索到索引0位置后,会 ...

懂了,你的一句整个字符串就说清楚了,之前一直以为是从指定位置处开始向前搜索到0后就不再搜索了,谢谢你的解惑!
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
Tupurp 初级黑马 2017-3-17 16:45:55
8#
barcelona 发表于 2017-3-17 16:29
懂了,你的一句整个字符串就说清楚了,之前一直以为是从指定位置处开始向前搜索到0后就不再搜索了,谢谢 ...

那你不好奇为什么你len3结果居然是2吗
回复 使用道具 举报
本帖最后由 barcelona 于 2017-3-17 17:11 编辑
Tupurp 发表于 2017-3-17 16:45
那你不好奇为什么你len3结果居然是2吗

我仔细想了想,好像是没怎么想通. 这句话:返回指定子字符串在此字符串中最后一次出现处的索引,它这里的最后一次出现到底怎么才算最后一次出现,还有你给的图片中的关于k值得公式也看不懂.
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
Tupurp 发表于 2017-3-17 16:45
那你不好奇为什么你len3结果居然是2吗

我在想关于那个k值的公式,虽然没怎么看懂,但是我有以下理解,不知对不对?
从你索引位置开始,不管你是正向搜索还是反向搜索,只要和你的子字符串有相同的字符串,那么返回值就是第一次出现你字符串的索引值?
我不知道有没有表达清楚
回复 使用道具 举报
字体颜色怎么设置的
回复 使用道具 举报
zhao543 发表于 2017-3-17 19:31
字体颜色怎么设置的

Window—>Preferences—>General—>Apperance选择主题为Dark
回复 使用道具 举报
barcelona 发表于 2017-3-17 16:29
懂了,你的一句整个字符串就说清楚了,之前一直以为是从指定位置处开始向前搜索到0后就不再搜索了,谢谢 ...

我之前理解的是错的哦!!!亲,只搜索引位置前面的
回复 使用道具 举报
通俗点来说,一条轮船,给你划一片水域,你船头进去了,哪怕你船尾还在外面,你也算这个水域的了(当然,前提是你中间船身得有,你得是一条完整的船)
回复 使用道具 举报
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
注意是最后一次出现处的索引,认真看这几个字,大兄弟
回复 使用道具 举报
整了一早上,还是没整懂
回复 使用道具 举报
newu 黑马帝 2017-3-18 13:10:56
17#
楼主厉害,支持楼主
回复 使用道具 举报
Tupurp 发表于 2017-3-17 16:13
修改后的,希望管理员给技术分
我看了下源码。大体内容如下:
首先呢lastindexof(str)方法体内部直接只写 ...

谢谢这么耐心的解答,我也看了源码很久,还是没怎么看懂,可能是源于才入门吧,我想以后会理解的更好.
然后关于你以上的解答,我有几个问题:
1:这句话     其次,再判断你这个子串是不是空的啊,如果是空的,且你定义的索引位置没有超出我母串的长度,那就输出你的索引,否则输出母串的最后一个索引角标(这里我有点疑问:我觉得这里应该是输出母串的最后一个索引角标加一.但我不明白这个意义在哪里?)。   
2:比如说啊,子串有六个字符,已经有两个一样了,但是这时候发现和子串倒数第三个字符比较的(int+srtlong)角标位置到了角标1了,那还比个屁啊,肯定不满足啊.    这里我觉得是如果已经有两个一样的,倒数第三个不一样,那么又会重新开始和子串的最后一个字符比较?

最后,我觉得它API里的说法很容易让人误解,只有仔细去看看源码才能更好的理解!
回复 使用道具 举报
newu 发表于 2017-3-18 13:10
楼主厉害,支持楼主

高级黑马都来水经验了,哈哈?
回复 使用道具 举报
陈大仙… 发表于 2017-3-18 09:16
整了一早上,还是没整懂

仔细研究下源码会加深理解
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马