比较器

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2022-06-25

Compare: 自然排序

import org.junit.Test;

import java.util.Arrays;

public class CompareTest {

  // 在Java中的对象,正常情况下,只能比较 == 或者 !=,不能比较大小
  // 但在开发场景,需要对多个对象排序,就需要比较对象的大小
  // Comparable 或 Comparator

  /**
   * Comparable的使用
   */
  @Test
  public void test1() {
    String[] arr = new String[]{"AA", "CC", "DD", "BB", "GG", "MM", "EE"};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr)); // "[AA, BB, CC, DD, EE, GG, MM]"

    // String 实现了Comparable接口,重写了compareTo方法,给出了比较两个对象大小的方式,所有Arrays.sort才能对其进行排序

    // 重写compareTo(obj)的规则:
    //  如果当前对象this大于形参obj,则返回正整数
    //  如果当前对象this小于形参obj,则返回负整数
    //  如果当前对象this等于形参obj,返回零
  }

  /**
   * 对实现了Comparable接口的类进行比较
   */
  @Test
  public void test2() {
    Goods[] arr = new Goods[4];
    arr[0] = new Goods("手机", 4999.00);
    arr[1] = new Goods("香烟", 20.00);
    arr[2] = new Goods("鼠标", 108.00);
    arr[3] = new Goods("牙刷", 2.00);
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
    // [Goods{name='牙刷', price=2.0}, Goods{name='香烟', price=20.0}, Goods{name='鼠标', price=108.0}, Goods{name='手机', price=4999.0}]
  }
}

// 实现Comparable接口
class Goods implements Comparable {
  private String name;
  private double price;

  public Goods() {
  }

  public Goods(String name, double price) {
    this.name = name;
    this.price = price;
  }

  @Override
  public int compareTo(Object o) {
    if (o instanceof Goods) {
      Goods good = (Goods) o;
      if (this.price > good.price) {
        return 1;
      } else if (this.price < good.price) {
        return -1;
      }
      return 0;
    }

    throw new RuntimeException("传入的数据类型不一致");
  }

  public String getName() {
    return name;
  }

  public double getPrice() {
    return price;
  }

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

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

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

Comparator: 定制排序

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

public class CompareTest2 {

  /**
   * Comparator接口的使用:定制排序
   * 背景:
   *  当元素的类型没有实现java.lang.Comparable接口,而又不方便修改代码
   *  或者实习了, 但是不适用业务场景
   *  则可以考虑使用 java.util.Comparator
   *
   *  compare(Object o1, Object o2)的规则:
   *    如果o1大于o2,则返回正整数
   *    如果o1小于o2,则返回负整数
   *    如果等于,返回零
   */
  @Test
  public void test() {
    String[] arr = new String[]{"AA", "CC", "DD", "BB", "GG", "MM", "EE"};

    // 使用匿名类,只使用一次
    Arrays.sort(arr, new Comparator(){
      @Override
      public int compare(Object o1, Object o2) {
        if (o1 instanceof String && o2 instanceof  String) {
          String s1 = (String) o1;
          String s2 = (String) o2;
          // 改变默认的升序为降序 sort完之后的结果就会改变
          return -s1.compareTo(s2);
        }

        throw new RuntimeException("传入的数据类型不一致");
      }
    });

    System.out.println(Arrays.toString(arr)); // "[MM, GG, EE, DD, CC, BB, AA]"
  }
}