java中Comparable 和 Comparator 区别及实例演示
2016-06-03 11:24
731 查看
java中有两种方式可以进行集合的排序:
1、集合中对象的所属类实现java.lang.Comparable 接口
2、集合指定比较器 java.lang.Comparator 的实现类
下面就Comparable 和Comparator 进行简单的介绍:
一、Comparable 接口
1、若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
2、接口定义
eg: x.compareTo(y) ,x<y 返回-1,x>y返回1,x=y 返回0
比较的数据类型:
1)、BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short----------按数字大小排序
2)、Character-----------按 Unicode 值的数字大小排序
3)、String----------------按字符串中字符 Unicode 值排序
3、代码展示
1)、Person.java,实现Comparable接口
package cn.java.compare;
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.name.compareTo(o.name);
}
}
2)、TestPerson.java测试类
jon 21
daivd 28
tom 26
bob 25
----------------------
bob 25
daivd 28
jon 21
tom 26
二、 Comparator 接口
1、若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可
2、接口定义
2)、int compare(T o1, T o2) 是“比较o1和o2的大小”,o1<o2 返回负数;o1>o2;返回正数,o1==o2返回零.
3、代码展示
1)、User.java
package cn.java.compare;
public class User {
private int id;
private String name;
private int age;
public User(int id, String name,int age) {
this.id = id;
this.name = name;
this.age=age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
2)、UserComparator.java 实现Comparator的接口
package cn.java.compare;
import java.util.Comparator;
public class UserComparator implements Comparator<User>{
@Override
public int compare(User user1, User user2) {
// if (user1.getAge()<user2.getAge()) {
// return -1;
// }else if(user1.getAge()>user2.getAge())
// {
// return 1;
// }else
//
// return 0;
return user1.getAge()-user2.getAge();
}
}
3)、TestComparator.java 测试类
package cn.java.compare;
import java.util.Arrays;
public class TestComparator {
public static void main(String[] args) {
User[] userArray=new User[]{new User(1, "jon", 25),new User(2, "tom", 28),new User(3, "juan", 26),new User(4, "david", 25)};
disPlay(userArray);
Arrays.sort(userArray, new UserComparator());
System.out.println("--------------------");
disPlay(userArray);
}
public static void disPlay(User[] data) {
for (int i = 0; i < data.length; i++) {
System.out.println(data[i].getId()+" "+data[i].getName()+" "+data[i].getAge());
}
}
}
4)、输出结果前后对比
1 jon 25
2 tom 28
3 juan 26
4 david 25
--------------------
1 jon 25
4 david 25
3 juan 26
2 tom 28
1、集合中对象的所属类实现java.lang.Comparable 接口
2、集合指定比较器 java.lang.Comparator 的实现类
下面就Comparable 和Comparator 进行简单的介绍:
一、Comparable 接口
1、若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
2、接口定义
package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T o); }
eg: x.compareTo(y) ,x<y 返回-1,x>y返回1,x=y 返回0
比较的数据类型:
1)、BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short----------按数字大小排序
2)、Character-----------按 Unicode 值的数字大小排序
3)、String----------------按字符串中字符 Unicode 值排序
3、代码展示
1)、Person.java,实现Comparable接口
package cn.java.compare;
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
return this.name.compareTo(o.name);
}
}
2)、TestPerson.java测试类
package cn.java.compare; import java.util.Arrays; public class TestPerson { public static void main(String[] args) { Person[] data=new Person[]{new Person("jon", 21),new Person("daivd", 28),new Person("tom", 26),new Person("bob", 25)}; disPlay(data); Arrays.sort(data); System.out.println("----------------------"); disPlay(data); } public static void disPlay(Person[] data) { for (int i = 0; i < data.length; i++) { System.out.println(data[i].getName()+" "+data[i].getAge()); } } }3)、输出结果前后对比
jon 21
daivd 28
tom 26
bob 25
----------------------
bob 25
daivd 28
jon 21
tom 26
二、 Comparator 接口
1、若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可
2、接口定义
package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }1)、若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数;
2)、int compare(T o1, T o2) 是“比较o1和o2的大小”,o1<o2 返回负数;o1>o2;返回正数,o1==o2返回零.
3、代码展示
1)、User.java
package cn.java.compare;
public class User {
private int id;
private String name;
private int age;
public User(int id, String name,int age) {
this.id = id;
this.name = name;
this.age=age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
2)、UserComparator.java 实现Comparator的接口
package cn.java.compare;
import java.util.Comparator;
public class UserComparator implements Comparator<User>{
@Override
public int compare(User user1, User user2) {
// if (user1.getAge()<user2.getAge()) {
// return -1;
// }else if(user1.getAge()>user2.getAge())
// {
// return 1;
// }else
//
// return 0;
return user1.getAge()-user2.getAge();
}
}
3)、TestComparator.java 测试类
package cn.java.compare;
import java.util.Arrays;
public class TestComparator {
public static void main(String[] args) {
User[] userArray=new User[]{new User(1, "jon", 25),new User(2, "tom", 28),new User(3, "juan", 26),new User(4, "david", 25)};
disPlay(userArray);
Arrays.sort(userArray, new UserComparator());
System.out.println("--------------------");
disPlay(userArray);
}
public static void disPlay(User[] data) {
for (int i = 0; i < data.length; i++) {
System.out.println(data[i].getId()+" "+data[i].getName()+" "+data[i].getAge());
}
}
}
4)、输出结果前后对比
1 jon 25
2 tom 28
3 juan 26
4 david 25
--------------------
1 jon 25
4 david 25
3 juan 26
2 tom 28
相关文章推荐
- Java Double相加出现的怪事
- Java中的IO流系统详解
- shiro表单登录认证及退出(自定义form认证器)
- java访问控制修饰符
- spring 基于java的配置
- java 枚举类型
- Spring加载properties文件的方法
- 华为机试---密码验证合格程序
- Java代码编写规范(不是标准规范,自行整理,无须纠结)
- java垃圾回收算法之-标记清除
- 走进Java中的持有对象(容器类)之一 容器分类
- 使用ZooKeeper实现Java跨JVM的分布式锁
- Spring通过SchedulerFactoryBean实现调度任务的配置
- log4j配置详解
- 解决用户多次点击弹出Toast队列长时间显示问题
- JavaFX
- Java把html转成word
- java的四种引用
- Java一些常见的出错异常处理方法总结
- java 页面url传值中文编码&解码