java干货Java学习笔记java

【Java】Comparable & Comparato

2016-08-03  本文已影响105人  wuchaooooo

今天自己翻了一下前面学习的知识,突然间看到这个话题,回想了一下,感觉自己对Comparable和Comparator的理解印象不是很深了。就打算写一下这一篇博客,重温一下好了。之后自己再不明确的时候,也可以来翻一下。


区别

用Comparator是策略模式(Strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变他的行为。

那就有一个疑问了,为什么需要存在Comparator呢?我们都用Comparable不就好了吗?哈哈。这里我们就有一个场景啦。比如对于字符串的排序,String类已经实现了Comparable接口,它的compareTo()方法是把字符串按照字典顺序进行排列。那我们如果想要字符串按照长度来排序呢?String类是不允许我们修改它而且是一个final类(最终类)是不能被继承的,也就是说我们不能去重写compareTo()方法。那么我们就必须实现Comparator接口,生成一个比较器。这样的解释应该挺明白了吧。

Comparable示例程序

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

public class StudentComparable implements Comparable<StudentComparable> {    
  private String name;    
  private int age;    

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

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

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

  public String getName() {        
    return name;    
  }    

  public int getAge() {        
    return age;    
  }    

  @Override    
  public boolean equals(Object o) {        
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }        

    StudentComparable that = (StudentComparable) o;        
    if (getAge() != that.getAge()) {
      return false;
    }        

    return getName() != null ? getName().equals(that.getName()) : that.getName() == null;    
  }    

  @Override    
  public int hashCode() {        
    int result = getName() != null ? getName().hashCode() : 0;        
    result = 31 * result + getAge();        
    return result;    
  }    

  @Override    
  public int compareTo(StudentComparable o) {        
    if (this.name.compareTo(o.getName()) > 0) {            
      return 1;        
    }else if (this.name.compareTo(o.getName()) < 0) {            
      return -1;        
    }        
    return 0;    
  }    

  @Override    
  public String toString() {        
    return "StudentComparable{" + "name='" + name + '\'' + ", age=" + age + '}';    
  }    

  public static void main(String[] args) {        
    List<StudentComparable> list = new ArrayList<>();        
    list.add(new StudentComparable("Jack", 16));        
    list.add(new StudentComparable("Mike", 25));        
    list.add(new StudentComparable("Summer", 17));        
    list.add(new StudentComparable("Bob", 19));        
    Collections.sort(list);        
    for (StudentComparable stu : list) {            
      System.out.println(stu);        
    }    
  }
}

Comparator示例代码

import java.util.*;

class A implements Comparator<String> {    
  @Override    
  public int compare(String s1, String s2) {        
    int len1 = s1.length();        
    int len2 = s2.length();        
    if (len1 > len2) {            
      return 1;        
    }else if (len1 < len2) {            
      return -1;        
    }else {            
      return 0;        
    }    
  }
}

public class ComparatorTest {    
  public static void main(String[] args) {        
    List<String> list = new ArrayList<>();        
    list.add("cat");        
    list.add("fish");        
    list.add("dog");        
    list.add("panda");        
    Collections.sort(list, new A());        
    System.out.println(list);    
  }
}

注意

上一篇 下一篇

猜你喜欢

热点阅读