Comparable接口与Comparator接口的比较————Comparable接口详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comparable接口与Comparator接口的比较————Comparable接口详解相关的知识,希望对你有一定的参考价值。
Comparable接口位于:java.lang包中。
Comparable接口:
1. 实现了这个接口的类,会被强制进行自然排序。
问题又来了:那什么是自然排序呢?
自然排序:就是字典序排序,不分大小写。例如:a、A都排在b、B之前。
做个简单的测试吧:
现在有个需求,需要让你把用户进行自然排序。So,亲爱的小伙伴们,这应该
怎么做呢?
思路:创建一个用户类(User),且此类实现了Comparable接口,然后进行测试。
记住了呦:
Collections.sort();可以对列表进行排序。
Arrays.sort();可以对数组进行排序哦。
嘿嘿,Let‘s do a test!
下面是User类的代码:
package test;
public class User implements Comparable<User>{ private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } /* * 先比较name, * 大于,返回1 * 等于,接着比较age * age:大于,返回1 * 等于,返回0 * 小于,返回-1 * 小于:返回-1 * (non-Javadoc) * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(User o) { int flag = 0; flag = this.getName().compareTo(o.getName()); if(flag == 0) { flag = this.getAge().compareTo(o.getAge()); return flag; }else { return flag; } } }
下面是做测试的代码UserTest:
package test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class UserTest { public static void print(List<User> list) { for(User u : list) { System.out.println(u); } } public static void print(User[] array) { for(int i=0; i<array.length; i++) { System.out.println(array[i]); } } public static void main(String[] args) { List<User> users = new ArrayList<User>(); users.add(new User("a",12)); users.add(new User("C",25)); users.add(new User("B",12)); users.add(new User("A",15)); users.add(new User("b",19)); users.add(new User("c",17)); users.add(new User("a",22)); System.out.println("排序前:"); print(users); System.out.println(); System.out.println(); System.out.println("排序后:"); Collections.sort(users); print(users); User[] users2 = new User[]{ new User("a",12), new User("C",25), new User("B",12), new User("A",15), new User("b",19), new User("c",17), new User("a",22) }; System.out.println("排序前:"); print(users2); System.out.println(); System.out.println(); System.out.println("排序后:"); Arrays.sort(users2); print(users2); } }
小伙伴们想一下,程序运行的结果应该是什么?
哈哈,结果应该是:
A 15 B 12 C 25 a 12 a 22 b 19 c 17
可能有的小伙伴想的是:
a 12 A 15 a 22 B 12 b 19 c 17 C 25
嘿嘿,上面的结果,也是我第一次考虑出的结果,程序运行后得到并不一样怎么办?哪里有错呢?看了几遍,感觉命名没错哈?!No, 还是有错,并不是代码有错哦,而是你出错了!
嘿嘿,请小伙伴仔细看User中的compareTo方法:
在compareTo方法中的第二行:flag = this.getName().compareTo(o.getName()); 这句话就是罪魁祸首,还真是可恶啊!!!该死,嘻嘻!
有没有小伙伴看出什么的呢?
好啦,flag = this.getName().compareTo(o.getName());这句话中也有compareTo方法,在api中找到String的compareTo(String)方法,小编发现了一个重大新闻、重大新闻、重大新闻!!!
重要的事情说三遍:String的compareTo(String)方法中有这个说明:
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。
这意味着什么呢?意味着:字符串的排序虽是字典顺序排序,但是大小写有分别。A的Unicode值在a的Unicode前面,所以A排在a的前面咯。
所以这个问题就解决了。
String的compareTo(String)方法的下面,还有一个让小编看了特兴奋的方法!!!是什么呢?哈哈,是compareToIgnoreCase(String)方法啦。
从方法的名字就能理解:使用这个方法进行比较字符串时,忽略、忽略、忽略大小写,哈哈!!!
当然,这只是小编的猜想,具体是什么作用?还是得看实际的结果对吧!测试的结果如下:
User [name=a, age=12] User [name=A, age=15] User [name=a, age=22] User [name=B, age=12] User [name=b, age=19] User [name=c, age=17] User [name=C, age=25]
是不是和之前的猜想一样呢!哈哈,今天Comparable接口就到这里了,ByeBye!!!
以上是关于Comparable接口与Comparator接口的比较————Comparable接口详解的主要内容,如果未能解决你的问题,请参考以下文章