疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

对象大小对比之Comparable与Comparator


 

 
一 概述
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”,最终结果升序排列,反之降序。
 
输出: