本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2022-06-25
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 +
'}';
}
}
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]"
}
}