美文网首页
Comparable 和Comparator

Comparable 和Comparator

作者: 回忆之秋 | 来源:发表于2017-05-21 11:38 被阅读0次

Comparable:中文翻译:可比较的 adj
自定义的对象通过实现Comparable接口,成为一个可比较的对象,通过自定义Comparable中的CompareTo方法来实现不同方式的比较

public interface Comparable<T>{
   int compareTo(T other);
}

如下,通过实现Comparable接口,自定义ComparaTo方法,实现红茶之间通过价格来比较,从而使红茶按照价格的高低排序。(a.compareTo(b), 如果a与b相等,则返回0,排序后a位于b之前,则返回负值,a位于b之后,则返回正值)

package site.yourdiary;

/**
* Created by star on 5/21/2017.
*/
public class RedTea implements Comparable<RedTea>{
   private String name;
   private int price;

   public RedTea(String name, int price){
       this.name = name;
       this.price = price;
   }

   @Override
   public int compareTo(RedTea redTea) {
       if(this.price < redTea.price){
           return -1;
       }else if(this.price == redTea.price){
           return 0;
       }else{
           return 1;
       }
   }

   @Override
   public String toString() {
       return "name:" + name + " price:" + price ;
   }
}

然而,使用Comparable接口定义排序显然有局限性。对于一个给定的类,只能够实现接口一次。如果在一个集合中需要按照价格排序,在另一个集合中按照名字排序,该怎么办呢?另外,如果需要对一个类的对象进行排序,而这个类的创建值又没有费心实现Comparable接口,又该怎么办呢?

在这种情况下,可以通过Comparator对象传递给其他对象,告诉它使用不同的比较方法
Comparator:比较仪,比较器

public interface Comparator<T>{
   int compare(T a, T b);
}

与compareTo方法一样,如果a位于b之前,则返回负值;如果a和b相等,则返回0,否则返回正值。
定义了一个GreenTea类,该类没有实现Comparable接口,所以是无法比较的

package site.yourdiary;

/**
 * Created by star on 5/21/2017.
 */
public class GreenTea {
    private String name;
    private int price;

    public GreenTea(String name, int price){
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "name:" + name + " price:" + price;
    }

}

自定义一个比较器,实现GreenTea对象的比较,自定义Compare方法,实现不同的比较方式

package site.yourdiary;

import java.util.Comparator;

/**
 * Created by star on 5/21/2017.
 */
public class ItemComparator implements Comparator<GreenTea> {

    @Override
    public int compare(GreenTea o1, GreenTea o2) {
        String nameo1 = o1.getName();
        String name02 = o2.getName();
        return nameo1.compareTo(name02);
    }
}

以TreeSet为例,将比较器传递给TreeSet,TreeSet就知道该如何比较GreenTea了

package site.yourdiary;

import java.util.Set;
import java.util.TreeSet;

/**
 * Created by star on 5/21/2017.
 */
public class ItemTreeSet {
    public static void main(String[] args) {
        ItemComparator itemComparator = new ItemComparator();
        Set<GreenTea> set = new TreeSet(itemComparator);
        set.add(new GreenTea("GreenTea3", 5));
        set.add(new GreenTea("GreenTea2", 4));

        for(GreenTea c: set){
            System.out.println(c);
        }
    }
}

TreeSet能实现有序排序,但是要求传入的对象必须告诉它如何排序

按名字排序顺序打印出来的结果.png

相关文章

网友评论

      本文标题:Comparable 和Comparator

      本文链接:https://www.haomeiwen.com/subject/nyvmxxtx.html