您的位置:首页 > 其它

对象大小对比之Comparable与Comparator

2017-07-10 23:16 288 查看

一 概述

1.Comparable与Comparator使用背景

数值型数据(byte int short long float double)天生可对比大小,可排序,String实现了Comparable接口也可以对比大小与排序,而自定义类多种多样,没有一个共有的可以用作排序的指标,因此需要在自定义类中手动建立对比的方法,出于这个目的,java提供了两个接口Comparable与Comparator。

2.集合排序

Collections.sort()底层排序依靠的是Arrays.sort(),而Arrays.sort()排序时采用的是冒泡法。

二 Comparable

需要对比大小的对象可以实现Comparable接口,实现其中的抽象方法,该抽象方法用来设定比较的方式。下面以一个示例进行说明:

1.实体类

package com.javase.collections.comparable;

public class Student implements Comparable<Student> {

private String name;
private int score;

public Student() {
super();
}

public Student(String name, int score) {
super();
this.name = name;
this.score = score;
}

public String getName() {
return name;
}

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

public int getScore() {
return score;
}

public void setScore(int score) {
this.score = score;
}

@Override
public int compareTo(Student stu) {
return this.score - stu.score;// 操作对象减去参数对象,升序排列,反之降序。
}

}


在compareTo()方法中,以属性score为排序指标,采用“this.score-stu.score”,最终结果以升序排列,反之降序。

2.测试类

package com.javase.collections.comparable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.junit.Test;

public class ComparableTest {

@Test
public void testComparable() {
List<Student> stus = new ArrayList<Student>();
Student zhangsan = new Student("zhangsan", 100);
Student lisi = new Student("lisi", 90);
Student wanger = new Student("wanger", 95);
stus.add(zhangsan);
stus.add(lisi);
stus.add(wanger);
System.out.println("排序前");
for (Student x : stus) {
System.out.println(x.getName() + "::" + x.getScore());
}
System.out.println("排序后");
Collections.sort(stus);
for (Student x : stus) {
System.out.println(x.getName() + "::" + x.getScore());
}
}

}


输出:



三 Comparator

如果一个类在创建时未实现Comparable接口,希望在不修改源码的情况下对其对象进行排序,可以在调用排序方法时实现Comparator比较器接口,指定排序方法。下面以一个示例进行说明:

1.实体类

package com.javase.collections.comparator;

public class Student {
private String name;
private int score;

public Student() {
super();
}

public Student(String name, int score) {
super();
this.name = name;
this.score = score;
}

public String getName() {
return name;
}

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

public int getScore() {
return score;
}

public void setScore(int score) {
this.score = score;
}

}


2.测试类

package com.javase.collections.comparator;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.junit.Test;

public class ComparatorTest {

@Test
public void test() {
List<Student> stus = new ArrayList<Student>();
Student zhangsan = new Student("zhangsan", 100);
Student lisi = new Student("lisi", 90);
Student wanger = new Student("wanger", 95);
stus.add(zhangsan);
stus.add(lisi);
stus.add(wanger);
System.out.println("排序前");
for (Student x : stus) {
System.out.println(x.getName() + "::" + x.getScore());
}
System.out.println("-----------------------");
Collections.sort(stus, new Comparator<Student>() {
@Override
public int compare(Student stu01, Student stu02) {
// return stu01.getScore() - stu02.getScore();//升序
return stu02.getScore() - stu01.getScore();// 降序
}
});

System.out.println("排序后");
for (Student x : stus) {
System.out.println(x.getName() + "::" + x.getScore());
}
}

}


在compare(Student stu01, Student stu02)方法中,以属性score为排序指标,采用“stu01.score-stu02.score”,最终结果升序排列,反之降序。

输出:



参考:

http://www.tiantianbianma.com/java-comparable-comparator.html/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: