黑马程序员技术交流社区

标题: 小白求助 [打印本页]

作者: barcelona    时间: 2017-3-17 14:37
标题: 小白求助
本人小白一枚,在使用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=MTUxNzY1fDNlOTgzZDY4MmI3NTUzMDAzYmVmNGM2OWQ4ZDRiNDIzfDE3MzEwMzA3NjI%3D&request=yes&_f=.png

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

2.png

作者: vampire-ho    时间: 2017-3-17 15:27
indexof和lastIndexof区别主要是,前者从左到右,后者从右往左。这样子的话,不是输出2/8/8吗,额,我是新手,哈哈

作者: barcelona    时间: 2017-3-17 16:10
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 16:13
本帖最后由 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角标是可以放在这个索引位置的(因为源码里就是这意思)

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


作者: Tupurp    时间: 2017-3-17 16:14
C:\Users\Administrator\Desktop\2.png
作者: Tupurp    时间: 2017-3-17 16:16
我还不信传不上来了

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

我还不信我传不上来了

我还不信我传不上来了

作者: barcelona    时间: 2017-3-17 16:29
Tupurp 发表于 2017-3-17 16:13
因为该方法是从指定索引处反向搜索整个,注意是整个     字符串是否包含子串,它反向搜索到索引0位置后,会 ...

懂了,你的一句整个字符串就说清楚了,之前一直以为是从指定位置处开始向前搜索到0后就不再搜索了,谢谢你的解惑!

作者: Tupurp    时间: 2017-3-17 16:45
barcelona 发表于 2017-3-17 16:29
懂了,你的一句整个字符串就说清楚了,之前一直以为是从指定位置处开始向前搜索到0后就不再搜索了,谢谢 ...

那你不好奇为什么你len3结果居然是2吗
作者: barcelona    时间: 2017-3-17 16:54
本帖最后由 barcelona 于 2017-3-17 17:11 编辑
Tupurp 发表于 2017-3-17 16:45
那你不好奇为什么你len3结果居然是2吗

我仔细想了想,好像是没怎么想通. 这句话:返回指定子字符串在此字符串中最后一次出现处的索引,它这里的最后一次出现到底怎么才算最后一次出现,还有你给的图片中的关于k值得公式也看不懂.

作者: barcelona    时间: 2017-3-17 17:39
Tupurp 发表于 2017-3-17 16:45
那你不好奇为什么你len3结果居然是2吗

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

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

我之前理解的是错的哦!!!亲,只搜索引位置前面的
作者: Tupurp    时间: 2017-3-17 22:55
通俗点来说,一条轮船,给你划一片水域,你船头进去了,哪怕你船尾还在外面,你也算这个水域的了(当然,前提是你中间船身得有,你得是一条完整的船)
作者: 旧时光9527    时间: 2017-3-18 01:17
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
注意是最后一次出现处的索引,认真看这几个字,大兄弟
作者: 陈大仙…    时间: 2017-3-18 09:16
整了一早上,还是没整懂
作者: newu    时间: 2017-3-18 13:10
楼主厉害,支持楼主

作者: barcelona    时间: 2017-3-18 15:38
Tupurp 发表于 2017-3-17 16:13
修改后的,希望管理员给技术分
我看了下源码。大体内容如下:
首先呢lastindexof(str)方法体内部直接只写 ...

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

最后,我觉得它API里的说法很容易让人误解,只有仔细去看看源码才能更好的理解!
作者: barcelona    时间: 2017-3-18 15:39
newu 发表于 2017-3-18 13:10
楼主厉害,支持楼主

高级黑马都来水经验了,哈哈?
作者: barcelona    时间: 2017-3-18 15:40
陈大仙… 发表于 2017-3-18 09:16
整了一早上,还是没整懂

仔细研究下源码会加深理解
作者: barcelona    时间: 2017-3-18 15:43
旧时光9527 发表于 2017-3-18 01:17
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
注意是最后一次出现处的 ...

我知道是最后一次出现处的索引,但是这个指定索引怎么理解?是不是就是lastIndexOf(String str, int fromIndex)方法中传递的参数fromIndex的值?其实并没有字面理解的那么简单.
作者: 旧时光9527    时间: 2017-3-18 16:12
Tupurp 发表于 2017-3-17 16:13
修改后的,希望管理员给技术分
我看了下源码。大体内容如下:
首先呢lastindexof(str)方法体内部直接只写 ...

解析了源码厉害了
作者: 旧时光9527    时间: 2017-3-18 16:18
barcelona 发表于 2017-3-18 15:43
我知道是最后一次出现处的索引,但是这个指定索引怎么理解?是不是就是lastIndexOf(String str, int fromIn ...

我看错了,应该从源码上回答的,楼上那位讲得很好
作者: 旧时光9527    时间: 2017-3-18 16:40
旧时光9527 发表于 2017-3-18 16:18
我看错了,应该从源码上回答的,楼上那位讲得很好

其实,子串与要比较的串(母串)比较,首先分别用字符数组存储,然后把子串的第一个字符与母串要开始的地方进行比较,子串的第一个r和母串中第一次出现r比较,发现相同,记录下这个索引,这时的索引是2,但是第二个r与母串不同,然后就不比较了,这时他返回的是第一个相同的索引,也就是2
主要是字符相比较,相同记录当时的索引
作者: barcelona    时间: 2017-3-18 17:53
旧时光9527 发表于 2017-3-18 16:40
其实,子串与要比较的串(母串)比较,首先分别用字符数组存储,然后把子串的第一个字符与母串要开始的地方 ...

从源码来看,我觉得你这样理解不对.
子串首先拿最后一个字符和母串比较,那么母串从什么地方开始呢?母串从指定的索引加子串最大索引值开始.楼上的解析源码的兄弟已经讲的很好了,可以仔细看看!
作者: 旧时光9527    时间: 2017-3-19 22:11
barcelona 发表于 2017-3-18 17:53
从源码来看,我觉得你这样理解不对.
子串首先拿最后一个字符和母串比较,那么母串从什么地方开始呢?母串从 ...

确实理解不对,看来要继续研读研读
作者: mrwalker    时间: 2017-3-20 11:18
看了源码没看懂,悲哀




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2