Java比较器
Posted 巧克力爱王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java比较器相关的知识,希望对你有一定的参考价值。
Java
实现对象排序的方式有两种:
①
自然排序:
java.lang.Comparable
② 定制排序:
java.util.Comparator
方式一:自然排序:
java.lang.Comparable
Comparable
接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。
实现
Comparable
的类必须实现
compareTo(Object obj)
方法,两个对象即通过 compareTo(Object
obj)
方法的返回值来比较大小。
如果当前对象
this
大于形参对象obj
,则返回正整数,如果当前对象
this
小于形参对象
obj
,则返回负整数,如果当前对象this
等于形参对象
obj
,则返回零。
实现
Comparable
接口的对象列表(和数组)可以通过
Collections.sort
或Arrays.sort进行自动排
序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
对于类
C
的每一个
e1
和
e2
来说,当且仅当
e1.compareTo(e2) == 0
与e1.equals(e2) 具有相同的
boolean
值时,类
C
的自然排序才叫做与
equals一致。建议(虽然不是必需的)
最好使自然排序
与
equals
一致
。
Comparable
的典型实现
:
(
默认都是从小到大排列的
)
String
:按照字符串中字符的
Unicode
值进行比较
Character
:按照字符的
Unicode
值来进行比较
数值类型对应的包装类以及
BigInteger
、
BigDecimal
:按照它们对应的数值大小进行比较
Boolean
:
true
对应的包装类实例大于
false
对应的包装类实例
Date
、
Time
等:后面的日期时间比前面的日期时间大
//在实现了Comparable接口的类Goods中重写的compareTo方法
@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 -1;
}else{
return this.name.compareTo(goods.name);
}
// return Double.compare(this.price,goods.price);
}
throw new RuntimeException("输入类型不对");
}
/*
实现comparable接口测试
*/
@Test
public void test1(){
Goods[] goods= new Goods[5];
goods[0] = new Goods("lenovo",45);
goods[1] = new Goods("Xiaomi",20);
goods[2] = new Goods("Huawei",45);
goods[3] = new Goods("Dell",60);
goods[4] = new Goods("logi",40);
Arrays.sort(goods);
System.out.println(Arrays.toString(goods));
}
方式二:定制排序:
java.util.Comparator
当元素的类型没有实现
java.lang.Comparable
接口而又不方便修改代码,
或者实现了
java.lang.Comparable
接口的排序规则不适合当前的操作,那
么可以考虑使用
Comparator
的对
象来排序
,强行对多个对象进行整体排序的比较。
重写
compare(Object o1,Object o2)
方法,比较
o1
和
o2
的大小:
如果方法返
回正整数,则表示
o1
大
于
o2
;如果返回
0
,表示相等;返回负整数,表示
o1
小于
o2
。
可以将
Comparator
传递给
sort
方法(如
Collections.sort
或
Arrays.sort
),从而允许在排序顺序
上实现精确控制。
还可以使用
Comparator
来控制某些数据结构(如有序
set
或有序映射)的顺序,或者为那些没有
自然顺序的对象 collection 提供排序。
/*
comparator类 实现定制排序
*/
@Test
public void test2(){
String[] arr = new String[]{"aa","ff","cc","ee","zz","mm"};
Arrays.sort(arr, new Comparator(){
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof String && o1 instanceof String){
String s1 = (String) o1;
String s2 = (String) o2;
return -s1.compareTo(s2);
}
// return 0;
throw new RuntimeException("输入类型不对");
}
});
System.out.println(Arrays.toString(arr));
}
以上是关于Java比较器的主要内容,如果未能解决你的问题,请参考以下文章