zoukankan      html  css  js  c++  java
  • 比较器比较对象数组Comparable和Comparator区别

    如果对对象数组进行排序,那么就应该指定类中属性进行比较,比如手机比较,可以比较手机价格大小,所以这个时候就需要实现java.lang.Comparable接口,而这个接口的定义如下:

    public interface Comparable<T> {

        public int compareTo(T o) ;

    }

    这个时候对于返回值只有三种:1(大于)、0(等于)、-1(小于)。

    代码实现:

     1 package cn.demo;
     2 import java.util.Arrays;
     3 class Phone implements Comparable<Phone>{
     4     private String brand;
     5     private double price;
     6     public Phone(String brand,double price){
     7         this.brand = brand;
     8         this.price = price;
     9     }
    10 
    11     public String toString() {
    12         return "品牌:" + this.brand + ",价格:" +this.price+"
    ";
    13     }
    14 public int compareTo(Phone o){
    15     if(this.price > o.price){
    16         return 1;
    17     }else if(this.price < o.price){
    18         return -1;
    19     }else{
    20         return 0;
    21     }
    22 }
    23 }
    24 public class Test{
    25     public static void main(String[] args) {
    26         Phone [] phones = new Phone[]{
    27                 new Phone("黑莓" ,999.99),
    28                 new Phone("白菜", 19.99),
    29                 new Phone("大白",799.99)};
    30         Arrays.sort(phones);
    31         System.out.println(Arrays.toString(phones));
    32         }
    33     }

    输出结果:

    [品牌:白菜,价格:19.99
    , 品牌:大白,价格:799.99
    , 品牌:黑莓,价格:999.99
    ]

    以后只要是见到数组排序(程序类自动的处理),那么不需要思索,直接使用Comparable。

    ***************************************************************************************************************************

    突然有一天你忽然发现需要对这个类的对象进行对象数组排序,但是你又不能够去修改这个类。

    如果现在类本身不具备排序的支持,那么可以直接使用java.util.Comparator接口实现排序规则的设置,等于你现在需要有一个单独的类负责排序规则的指定。在Comparator接口里面提供有如下的两个方法:

      · 对象相等比较:public boolean equals(Object obj);

      · 对象大小比较:public int compare(T o1, T o2)。

    范例:定义一个单独的比较规则类

     1 package cn.demo;
     2 
     3 import java.util.Arrays;
     4 import java.util.Comparator;
     5 
     6 class Phone{
     7     private String brand;
     8     private double price;
     9     public Phone(String brand,double price){
    10         this.brand = brand;
    11         this.price = price;
    12     }
    13 
    14     public String getBrand() {
    15         return brand;
    16     }
    17 
    18     public void setBrand(String brand) {
    19         this.brand = brand;
    20     }
    21 
    22     public double getPrice() {
    23         return price;
    24     }
    25 
    26     public void setPrice(double price) {
    27         this.price = price;
    28     }
    29 
    30     public String toString() {
    31         return "品牌:" + this.brand + ",价格:" +this.price+"
    ";
    32     }
    33 }
    34 class PhoneComparator implements Comparator<Phone>{
    35     public int compare(Phone o1,Phone o2)    {
    36     if(o1.getPrice() > o2.getPrice()){
    37             return 1;
    38         }else if(o1.getPrice() < o2.getPrice()){
    39             return -1;
    40         }else{
    41             return 0;
    42         }
    43     }
    44 }
    45 public class Test{
    46     public static void main(String[] args) {
    47         Phone [] phones = new Phone[]{
    48                 new Phone("黑莓" ,999.99),
    49                 new Phone("白菜", 19.99),
    50                 new Phone("大白",799.99)
    51                 };
    52     
    53         Arrays.sort(phones,new PhoneComparator());
    54         System.out.println(Arrays.toString(phones));
    55         }
    56}

    面试题:请解释Comparable和Comparator的区别?

    · 如果要进行对象数组的比较处理,那么必须有比较器的支持,比较器有两个:Comparable、Comoparator;

    · java.lang.Comparable是在类定义的时候实现好的接口,里面只定义有一个compareTo()方法;

    · java.util.Comparator属于挽救的比较器接口,需要单独定义一个比较规则类,里面有一个compare()方法,在JDK 1.8开始将其定义为函数式接口。

  • 相关阅读:
    POJ 3635 Full Tank?
    ZOJ 2112 Dynamic Rankings
    POJ 3468 A Simple Problem with Integers (2)
    FJOI2007 轮状病毒
    HDU 3308 LCIS
    POJ 2449 Remmarguts' Date
    Adroid平台图表案例源码
    Android项目——实现时间线程源码
    关于Ubuntu上Eclipse不显示手机设备
    自定义ListView下拉弹起效果
  • 原文地址:https://www.cnblogs.com/liyang31/p/5803261.html
Copyright © 2011-2022 走看看