Comparator VS Comparable && sort
2010-01-09 10:55
330 查看
昨天去笔试,发现居然关于这两个问题都忘得模糊了,复习一下。
1. Comparable接口
Comparable 是一个对象本身就已经支持自比较所需要实现的接口,位于java.lang下,实现该接口的类如String,int等可直接排序,
如Arrays.sort(new int[]{5,4,1,7})
该类将比较规则定义在实现该接口的类的内部,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
public class ComparableTest {
/**
* @param args
*/
public static void main(String[] args) {
Student s1 = new Student((int) (Math.random()*10));
Student s2 = new Student((int) (Math.random()*10));
System.out.println(s1.equals(s2));
Student s3 = new Student((int) (Math.random()*10));
System.out.println("S1.value: "+s1);
System.out.println("S2.value: "+s2);
System.out.println("S3.value: "+s3);
List<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list);//直接排序
System.out.println("AfterSort:");
for(Iterator<Student> it=list.iterator();it.hasNext();){
System.out.print(it.next()+" ");
}
}
}
class Student implements Comparable<Object> {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Student() {
value = 0;
}
public Student(int value) {
this.value = value;
}
//定义自己的比较规则,升序排列
@Override
public boolean equals(Object obj) {
Student s = (Student) obj;
return this.value == s.getValue();
}
@Override
public String toString() {
return Integer.toString(value);
}
@Override
public int compareTo(Object o) {
Student stu = (Student) o;
if (this.value > stu.getValue()) {
return 1;
}else if(this.value == stu.getValue())
return 0;
else
return 0;
}
}
2. Comparator接口
位于java.util下,
实现该接口的类只是一个比较规则,在对列表进行排序如Collections.sort()或Arrays.sort的时候,同时将该排序规则传入。
public class ComparatorTest {
/**
* @param args
*/
public static void main(String[] args) {
Teacher s1 = new Teacher((int) (Math.random()*10));
Teacher s2 = new Teacher((int) (Math.random()*10));
Teacher s3 = new Teacher((int) (Math.random()*10));
List<Teacher> list = new ArrayList<Teacher>();
list.add(s1);
list.add(s2);
list.add(s3);
System.out.println("Before Sorted: ");
for(Iterator<Teacher> it = list.iterator();it.hasNext();)
{
System.out.print(it.next()+" ");
}
Collections.sort(list, new MyComparator());//按照MyComparator类的排序方式排序
System.out.println("/nAfter Sorted: ");
for(Iterator<Teacher> it = list.iterator();it.hasNext();)
{
System.out.print(it.next()+" ");
}
}
}
class MyComparator implements Comparator<Teacher>
{
//自己定义排序规则类,按降序排列
@Override
public int compare(Teacher o1, Teacher o2) {
if(o1.getValue()>o2.getValue())
return -1;
else if(o1.getValue()== o2.getValue())
return 0;
else
return 1;
}
}
class Teacher
{
private int value;
public int getValue() {
return value;
}
public Teacher()
{
value=0;
}
public Teacher(int value)
{
this.value=value;
}
public String toString()
{
return Integer.toString(value);
}
}
总结:用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
另外:Collection VS Collections
java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
1. Comparable接口
Comparable 是一个对象本身就已经支持自比较所需要实现的接口,位于java.lang下,实现该接口的类如String,int等可直接排序,
如Arrays.sort(new int[]{5,4,1,7})
该类将比较规则定义在实现该接口的类的内部,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
public class ComparableTest {
/**
* @param args
*/
public static void main(String[] args) {
Student s1 = new Student((int) (Math.random()*10));
Student s2 = new Student((int) (Math.random()*10));
System.out.println(s1.equals(s2));
Student s3 = new Student((int) (Math.random()*10));
System.out.println("S1.value: "+s1);
System.out.println("S2.value: "+s2);
System.out.println("S3.value: "+s3);
List<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list);//直接排序
System.out.println("AfterSort:");
for(Iterator<Student> it=list.iterator();it.hasNext();){
System.out.print(it.next()+" ");
}
}
}
class Student implements Comparable<Object> {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Student() {
value = 0;
}
public Student(int value) {
this.value = value;
}
//定义自己的比较规则,升序排列
@Override
public boolean equals(Object obj) {
Student s = (Student) obj;
return this.value == s.getValue();
}
@Override
public String toString() {
return Integer.toString(value);
}
@Override
public int compareTo(Object o) {
Student stu = (Student) o;
if (this.value > stu.getValue()) {
return 1;
}else if(this.value == stu.getValue())
return 0;
else
return 0;
}
}
2. Comparator接口
位于java.util下,
实现该接口的类只是一个比较规则,在对列表进行排序如Collections.sort()或Arrays.sort的时候,同时将该排序规则传入。
public class ComparatorTest {
/**
* @param args
*/
public static void main(String[] args) {
Teacher s1 = new Teacher((int) (Math.random()*10));
Teacher s2 = new Teacher((int) (Math.random()*10));
Teacher s3 = new Teacher((int) (Math.random()*10));
List<Teacher> list = new ArrayList<Teacher>();
list.add(s1);
list.add(s2);
list.add(s3);
System.out.println("Before Sorted: ");
for(Iterator<Teacher> it = list.iterator();it.hasNext();)
{
System.out.print(it.next()+" ");
}
Collections.sort(list, new MyComparator());//按照MyComparator类的排序方式排序
System.out.println("/nAfter Sorted: ");
for(Iterator<Teacher> it = list.iterator();it.hasNext();)
{
System.out.print(it.next()+" ");
}
}
}
class MyComparator implements Comparator<Teacher>
{
//自己定义排序规则类,按降序排列
@Override
public int compare(Teacher o1, Teacher o2) {
if(o1.getValue()>o2.getValue())
return -1;
else if(o1.getValue()== o2.getValue())
return 0;
else
return 1;
}
}
class Teacher
{
private int value;
public int getValue() {
return value;
}
public Teacher()
{
value=0;
}
public Teacher(int value)
{
this.value=value;
}
public String toString()
{
return Integer.toString(value);
}
}
总结:用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
另外:Collection VS Collections
java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
相关文章推荐
- collections工具类-----sort排序详解(Comparable & Comparator)
- Comparable vs. Comparator in Java
- java.util.Collections.sort(List list)与Comparable,Comparator
- JDK1.8源码分析之Comparable && Comparator(九)
- Comparable& Comparator
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
- Arrays.sort、Comparable与Comparator两个接口的作用
- Comparable & Comparator 的区别
- Comparable vs Comparator in Java
- Comparable & Comparator
- Comparable & Comparator简介
- Strategy设计模式之Comparable&Comparator接口
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- Java提高十五:容器元素比较Comparable&Comparator深入分析
- 【慕课笔记】第六章 JAVA中的集合框架(下) 第7节 Comparable&Comparator简介
- Java Comparator Vs. Comparable
- Comparable VS Comparator
- 16.Java 基础 - Comparable & Comparator
- 比较器 comparable vs comparator