Comparable(比较器的使用)
Comparable(比较器的使用)
对比较器的理解 ---> 建议先看理解
对Collection的理解
两种比较器 :1- compareTo 2- new Comparator()
一、
当我们把类 --> 实现了implements Comparable -->会重写compareTo方法
(这个是通用方法,这个规定用什么来比较,就用什么来比较)
对实现了Comparable -- >方法的代码演示:
1-让类实现implements Comparable
2-会重写compareTo方法
下面为正文:
----------------->
/*
1- public class Person implements Comparable (1- 实现){
private String name;
private int age;
private MyDate birthday;
2- @Override ( 2- 重写)
public int compareTo(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return this.name.compareTo(p.name);
}
throw new RuntimeException("输入错误");
}
*/
二、
1-当然,我们不能被困死,所以有了new Comparator();方法
2- 用Comparator()方法的场景
场景: 上面的compareTo规定的按名字来比较大小,这个时候,你要以年龄来比较大小 --> 需求不就来了
3- 我们只要在 集合/数组 里面new Comparator(); 重写方法即可
下面是正文:
------------->
/*
//对new Comparator();方法的代码解析:
1- TreeSet treeSet = new TreeSet(new Comparator() { //(1- new Comparator();)
@Override
public int compare(Object o1, Object o2) { //2- 重写
if (o1 instanceof Person && o2 instanceof Person) {
Person person1 = (Person) o1; //记得大写
Person person2 = (Person) o2;
MyDate birthday1 = person1.getBirthday();
MyDate birthday2 = person2.getBirthday();
//比较年
int year = birthday1.getYear() - birthday2.getYear();
if (year != 0) {
return year;
}
//比较月
int month = birthday1.getMonth() - birthday2.getMonth();
if (month != 0) {
return month;
}
//比较日
return birthday1.getDay() - birthday2.getDay();
}
throw new RuntimeException("输入错误");
}
});
*/
1 --->先定义 CompareTo方法
package _366After.src.javeTeacher.compare.learn_compare;
/*
解释:--comparable对(自定义类)的比较
1- 让对比的(自定义类)implements Comparable
2- 重写compareTo
*/
public class Goods implements Comparable {
private String name;
private double price;
public Goods() {
}
public Goods(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Goods{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
@Override
//值明-商品大小来排序
public int compareTo(Object o) {
if (o instanceof Goods) {
Goods goods = (Goods) o;
//方式一、
if (this.price > goods.price) {
return 1;
} else if (this.price < goods.price) {
//return 0;
return -this.name.compareTo(goods.name);
}
//方式二、 return Double.compare(this.price, goods.price);
return this.name.compareTo(goods.name);
}
throw new RuntimeException("你输入的类型有误");
}
}
2-比较器的使用 ---> 使用CompareTo方法 and Comparator方法
package _366After.src.javeTeacher.compare.learn_compare;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.Comparator;
/*
一、正常的java只能用 == 或者 != 来比较大小
不能用< 或者 >
当我们需要对"对象"进行比较大小的时候--可以使用comparable 、comparator
二、comparable接口使用 -->自然排序(从小到大)
***三、1-对于String、包装类 ---直接使用Arrays.sort(XX数组); 来比较大小
2-如果是(自定义类)--需要 : 1-让对比的(自定义类中)implements Comparable 、 2- (在自定义类中)重写compareTo 3、再使用Arrays.sort(XX数组); 来比较大小
*/
public class learn_Compare {
//comparable的使用
@Test
public void TestComparable1() {
String[] str = new String[]{"ww", "aa", "cc", "rr", "tt"};
Arrays.sort(str);//从小到大
System.out.println(Arrays.toString(str));
}
@Test
public void TestComparable2() {//比较(自定义)的类
Goods[] goods = new Goods[5];
//调用构造器用new Goods();
goods[0] = new Goods("xiaomi", 23);//这里因为我的Goods什么方法都没写,为了可以赋值,就new Goods()调用的是有参构造器
goods[1] = new Goods("dell", 153);
goods[2] = new Goods("sanxin", 98);
goods[3] = new Goods("huawei", 103);
goods[4] = new Goods("huasuo", 103);
Arrays.sort(goods);//从小到大
System.out.println(Arrays.toString(goods));
}
-- > 这上面还是使用CompareTo -类中的比较器(来实现)
//————————————————————————————————————————————————————————————————————————————————————————
//————————————————————————————————————————————————————————————————————————————————————————
-- > 下面是脱离CompareTo的束缚 ,使用comparator方法(再次自定义)
/*
Comparator比较器(定制排序)
背景:1- 元素类没有实现Java.lang.Comparable接口而又不方便修改代码,
或者实现java.lang.Comparable接口的排序规则不适合当前的操作,
那么可以考虑使用Comparable的对象来排序
*/
@Test
//自定义类:从大到小排列
public void customComparable1() {
String[] str = new String[]{"ww", "aa", "cc", "rr", "tt"};
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1 instanceof String && o2 instanceof String) {
String s1 = (String) o1;
String s2 = (String) o2;
return -s1.compareTo(s2);
}
//return 0;
throw new RuntimeException("输入的类型不一样");
}
});
System.out.println(Arrays.toString(str));
}
@Test
public void customComparable2() {
Goods[] goods = new Goods[6];
//调用构造器用new Goods();
goods[0] = new Goods("xiaomi", 23);//这里因为我的Goods什么方法都没写,为了可以赋值,就new Goods()调用的是有参构造器
goods[1] = new Goods("dell", 153);
goods[2] = new Goods("dell", 267);
goods[3] = new Goods("sanxin", 98);
goods[4] = new Goods("huawei", 103);
goods[5] = new Goods("huasuo", 103);
//用自然类 --> Arrays.sort(goods);//从小到大
Arrays.sort(goods, new Comparator() {
//重写了Comparable
//指定商品比较大小的方式:按照产品的名称从低到高,再按照价格从高到低
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Goods && o2 instanceof Goods) {
Goods goods1 = (Goods) o1;
Goods goods2 = (Goods) o2;
if (goods1.getName().equals(goods2.getName())) {
return -Double.compare(goods1.getPrice(), goods2.getPrice());
} else {
return goods1.getName().compareTo(goods2.getName());
}
}
throw new RuntimeException("输入的类型不对");
}
});
System.out.println(Arrays.toString(goods));
}
}
分析:就是
1- 让对比的(自定义类)implements Comparable
2- 重写compareTo
对2-的理解:重点就是在重写的时候:可以直接在(自定义类中重写--自然类),但是要多样性,可以在接收页面重写。