Java CompareTo方法使用及详解

compareTo方法有两种:
compareTo(String str) 按字典顺序比较两个字符串。
compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。

compareTo大多数时候用作于排序,相对一般排序而言,用compareTo就够了,不考虑大小写的情况很少。compareTo是按照按字典顺序去比较两个字符串的,一般常用的字符串类型无非3个,阿拉伯数字格式,英文字母格式以及中文格式。其中数字格式的顺序最简单,英文字母格式次之,当然,最复杂的还是我们的国语,在忽略多音字的前提下,有多少个汉字?反正我是不知道了。字典表对汉字的排序规律我也不知道,太复杂,所有只研究了英文字母格式,在第二篇中具体说明。

先把代码和结果放出来:
在这里插入图片描述

排序是根据两个字符串之间的顺序比值来排列的,在此不补充排序方法,只对CompareTo方法解说。
(变量1).<方法>(变量2),返回的值是变量1比变量2的字典顺序。

注意点:
1、 顺序相等,则返回0,变量1的顺序在变量2之前则返回负值数,变量1的顺序在变量2之后则返回正值数。以此比较!
2、 比较的时候,相等则继续比较下一位数,直到有一位数不等,进行比较,但要注意,只会比较一次,以这一次的值作为比较数据;如果两个变量位数相等、顺序一致,则返回零;
3、 如果顺序相等,位数不等,则位数之间相减(多减少),其余规则不变。(如图中的:顺序相等,位数不同的比较)
字典顺序:
1、 阿拉伯数字:阿拉伯数字的顺序很简单,因为阿拉伯数字总体只有10个数字,从0到9。国际通用,顺序就是顺着来的。
2、 英文字母:代码本身就是西方人设计出来的,相对的,对他们的语言的基础(26字母)的编码也就更标准了,本人对26字母的字典顺序还是有一点点的不解。不影响分析。26字母区分大小写,大写字母的顺序排在小写字母之前。按字母顺序排列,大小写字母的顺序之间没有间隔,但在边界有一样的间隔,具体在第二篇讲。有兴趣的同学去查一下,本人有点懒。
3、 中文:中文的格式表示惹不起,具体排列没去查过,但在排序方法中,中文一般不作为比较值(出现的位数是一致的),比较的是数字或者字母为主。你若是作死,那没办法了。换个说法,以中文作为比较去排序没有意义!汉字在字典表中的顺序是非常庞大的,可以用中文去比较,但排序出来的顺序不是你想要的结果(结果未知性),因为字典顺序只比较一次!因此,在用CompareTo方法排序时,一般中文的比较值在各变量中都是相同的(同一个中文)比如都是用员工1,员工2等等,排序用到的是后面的数字;注意一般真正比较的值(位数)不是中文,是数字或者字母这些可以按想要顺序排列的值(位数)

补充说明一下:
在方法使用中(变量1).<方法>(变量2),得到的值是变量1在变量2的字典顺序之前还是之后,决定是正值还是负值,比如在图中的:阿拉伯数字格式,第一位数都是1,就跳过,然后1在9之前,得到的就是负值,1在9前8位,所以返回-8,只比较一次,所以,在比较不等值时只比较一次(上面说过相等就跳过,直到不等的位数进行比较,或者都相等就返回0),因为值比较一次,所以也就排序作用了。也许还能遍历出来所有的比较呢?没试过,有兴趣的童鞋可以尝试。

可以了解规律,实用性不是很高,可以自行判断相差值,排序方法时电脑已经计算好了的,所有更多的是理解作用,先上代码,有点懒,全部结合在一张图了。
在这里插入图片描述
声明一下,不介绍不区分大小写的,不区分后,没啥好说的,个人感觉compareToIgnoreCase就是为了填区分大小写时字典表的顺序问题的,compareTo的字典表顺序整体有点怪怪的感觉。
a与A的比较顺序是32,既是字典顺序中a在A的后32位,反过来比较就是-32.算是字母顺序中的一个中间数。相同的,其余两个也是一样的。
a与Z的比较顺序是7,既是字典顺序中a在Z的后7位,反过来比较就是-7.
z与A的比较顺序是57,既是字典顺序中z在A的后57位,反过来比较就是-57.
a与A的比较顺序是32,在这三个比较值中,算是中间位置,峰值是57,在字典表中,57是最后一个了,当然具体排序不清楚,57只是a在A顺序后57位(大写A在字母顺序中是第一个,小写z是最后一个),a与Z的比较顺序是7,别问我为啥中间空了7位数,我也不知道,理应Z之后下一个字典顺序就是a才对。所以某些时候要比较时有点乱,compareToIgnoreCase就应运而生了,修改字典表太麻烦,但能加呀!有不少方法就是亡羊补牢弄出来的。
虽然不知道字典表的具体排序顺序,但字母表的顺序除了前后有点怪,别的都正常。<z←→B>比较是56,按字母顺序递加,<z←→Y>比较是33, <z←→Z>比较又回到了32,<a←→Z>比较是7,反过来,<a←→Y>比较是8,按字母顺序递减,<a←→B>比较是31,<a←→A>比较是32,又回到了中间值,来来回回就是在26字母之间加减,只是中间多出了一些不存在于字母顺序的位数,不用纠结太多,别像我一样了。
研究了半天。区分大小写的情况下,逃不出57,比较值只会在-57到57之间产生,因为只比较一次,就算比较多次,也就多几个57到57之间的比值而已。区分大小写的话,逃不出25,比较值只会在-25到25之间产生。
还是要注意一下:compareTo的比较是比较不同点(或者说是找区别),并且是只比较一次。之后又多少不同点都不管的。就像是在区分对象,抓住一点不同就好,能区分就行。同等同值时就成了类了,比如都是男生,知道了,返回个零表示没区别。同值位数不等,就像是这一边有3个男生,那一边有1个男生,区别就是个数,就返回2,表示区别。正负值是看这个位数是在比较值之前还是之后,反过来就是了。

  • 22
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值