java重写compareTo()方法,比较对象的大小

理论:

使用Comparable或Comparator两个接口中的任何一个来比较对象的大小 一、Comparable接口的使用,自然排序

1.像String、BigDecimal、包装类(Integer、Double...)等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方法,默认从小到大的排序

2.重写compareTo(obj)的规则:

如果当前对象this大于形参对象obj,则返回正整数,

如果当前对象this小于形参对象obj,则返回负整数,

如果当前对象this等于形参对象obj,则返回零。

3.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo()方法,在compareTo(obj)方法中指明如何排序

二、Comparator接口的使用,定制排序

1.背景:

当元素的类型没有实现java.Lang.Comparable接口而又不方便修改代码,或者实现Comparable接口,但排序规则不满足当前的需求,那么可以考虑使用comparator的对象来排序。

2.重写compare(object o1, object o2)方法,比较o1和o2的大小:

如果方法返回正整数,则表示o1大于o2 ;

如果返回0,表示相等;

返回负整数,表示o1小于o2

实操:

一、使用Comparable接口

定义商品类Goods,实现了Comparable接口,重写了compareTo(obj)方法 ,指明商品比较大小的方法,按照价格从低到高,产品名称从低到高来排序

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 "Good{" +

"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

return -1;

}else{//价格相同,按照产品名称从低到高比较

return this.name.compareTo(goods.name);

}

//方法二: 推荐

// return Double.compare(this.price,goods.price);

}

else {

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

}

}

}

在测试类 CompareTest中,方法test2()调用sort方法,即可实现商品排序。

public class CompareTest {

//String类等实现了Comparable接口,重写了compareTo(obj)方法,可以直接调sort排序

@Test

public void test1() {

String[] arr = new String[]{"D", "B", "A", "C"};

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

}

@Test

public void test2() {

Goods[] arr = new Goods[4];

arr[0] = new Goods("lenovo", 5000);

arr[1] = new Goods("dell", 6000);

arr[2] = new Goods("xiaomi", 4000);

arr[3] = new Goods("microsoft", 4000);

Arrays.sort(arr);

System.out.println(Arrays.toString(arr));

}

}

结果如下

[Good{name='microsoft', price=4000.0}, Good{name='xiaomi', price=4000.0}, Good{name='lenovo', price=5000.0}, Good{name='dell', price=6000.0}]

二、使用Comparator接口

方法test4(),重写了compare(object o1, object o2)方法

public class CompareTest {

@Test

public void test3() {

String[] arr = new String[]{"D", "B", "A", "C"};

Arrays.sort(arr, new Comparator() {

//按照字符串从大到小的顺序排序,默认从小到大,加一个负号就可以实现从大到小

@Override

public int compare(String o1, String o2) {

return -o1.compareTo(o2);

}

});

System.out.println(Arrays.toString(arr));

}

@Test

public void test4() {

Goods[] arr = new Goods[5];

arr[0] = new Goods("A", 1);

arr[1] = new Goods("D", 5);

arr[2] = new Goods("C", 4);

arr[3] = new Goods("C", 6);

arr[4] = new Goods("B", 3);

Arrays.sort(arr, new Comparator() {

//指明比较大小的方式:先按照产品名称从低到高排序,再按照价格从高到低排序

@Override

public int compare(Goods o1, Goods o2) {

if (o1.getName().equals(o2.getName())) {

return -Double.compare(o1.getPrice(), o2.getPrice());

}

return o1.getName().compareTo(o2.getName());

}

});

System.out.println(Arrays.toString(arr));

}

}

结果如下

[Good{name='A', price=1.0}, Good{name='B', price=3.0}, Good{name='C', price=6.0}, Good{name='C', price=4.0}, Good{name='D', price=5.0}]

2025-08-13 15:41:29