求解Comparator和Comparable

Comparator接口,实现此接口的类就是一个排序器,Arrays和Collections都能在sort()方法的参数中指明排序方式,即实现Comparator接口的类的示例。
User类:

public class User {

private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public void setName(String name) {
this.name = name;
}

}

ComparatorUser类;
import java.util.Arrays;
import java.util.Comparator;

public class ComparatorUser implements Comparator<User> {

/**
* @param args
*/
public static void main(String[] args) {
User[] users = new User[] { new User("1", 15), new User("2", 19), new User("3", 17) };
for(User user : users) {
System.out.println(user.getName() + ":" + user.getAge());
}
Arrays.sort(users, new ComparatorUser());
for(User user : users) {
System.out.println(user.getName() + ":" + user.getAge());
}

}

@Override
public int compare(User user1, User user2) {
return ((User) user1).getAge() - ((User) user2).getAge();
}


}

结果:
1:15
2:19
3:17
1:15
3:17
2:19


这里的ComparatorUser就是一个排序器。只不过我将测试代码写在此类里边了。
写在外边的情况,User类不变,
ComparatorUser类:
import java.util.Comparator;

public class ComparatorUser implements Comparator<User> {

@Override
public int compare(User user1, User user2) {
return ((User) user1).getAge() - ((User) user2).getAge();
}

}

测试类:
import java.util.Arrays;

public class ComparatorTest {

/**
* @param args
*/
public static void main(String[] args) {
User[] users = new User[] { new User("jin", 18),
new User("gui", 19), new User("jin", 15),
new User("chao", 20) };
for(User user : users) {
System.out.println(user.getName() + ": " + user.getAge());
}
Arrays.sort(users, new ComparatorUser());
for(User user : users) {
System.out.println(user.getName() + ": " + user.getAge());
}
}

}

输出结果:
jin: 18
gui: 19
jin: 15
chao: 20
jin: 15
jin: 18
gui: 19
chao: 20



实现Comparable接口的类在进行排序时,就会默认对其用自身的排序机制进行排序。
import java.util.Arrays;


public class ComparableUser implements Comparable<ComparableUser> {

private String name;
private int age;

public ComparableUser(String name, int age) {
this.age = age;
this.name = name;
}

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;
}

/**
* @param args
*/
public static void main(String[] args) {
ComparableUser[] users = new ComparableUser[] { new ComparableUser("jin", 15), new ComparableUser("gui", 19), new ComparableUser("chao", 18), new ComparableUser("jin", 17) };
for(ComparableUser user : users) {
System.out.println(user.getName() + ":" + user.getAge());
}
Arrays.sort(users);
for(ComparableUser user : users) {
System.out.println(user.getName() + ":" + user.getAge());
}
}

@Override
public int compareTo(ComparableUser user) {
if(this.name.compareTo(user.getName()) != 0) {
return this.name.compareTo(user.getName());
}
return this.age - user.age;
}

}

结果:
jin:15
gui:19
chao:18
jin:17
chao:18
gui:19
jin:15
jin:17


总结:
Comparator是排序器,是一种规则,
实现Comparable接口,就说明,某个类有自己定义的排序规则。
如果对已经实现Comparable的类进行指定排序器的话,编译就会出错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值