Comparator VS Comparable && sort

来源:互联网 发布:多益网络ceo徐宥箴 编辑:程序博客网 时间:2024/06/06 04:40

昨天去笔试,发现居然关于这两个问题都忘得模糊了,复习一下。

 

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框架。