Java实现对象排序的两种方式详解
作者:努力的小鳴人
这篇文章主要介绍了Java实现对象排序的两种方式详解,在Java中经常会涉及到对象数组的排序问题,则就提到对象之间的比较问题,今天我们就来看一下两种不同排序方式之间的区别,需要的朋友可以参考下
一、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,则返回零
- 举例:
class Goods implements Comparable { private String name; private double price; 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 other = (Goods) o; if (this.price > other.price) { return 1; } else if (this.price < other.price) { return -1; } return 0; } throw new RuntimeException("输入的数据类型不一致"); } }
- 创建ComparableTest类来测试:
import java.util.Arrays; public class ComparableTest { public static void main(String[] args) { Goods[] all = new Goods[4]; all[0] = new Goods("《红楼梦》", 100); all[1] = new Goods("《西游记》", 80); all[2] = new Goods("《三国演义》", 140); all[3] = new Goods("《水浒传》", 120); Arrays.sort(all); System.out.println(Arrays.toString(all)); } }
结果为:
[Goods{name='《西游记》', price=80.0}, Goods{name='《红楼梦》', price=100.0}, Goods{name='《水浒传》', price=120.0}, Goods{name='《三国演义》', price=140.0}]
Comparable 的典型实现
(从小到大)
- String:按照字符串中字符的Unicode值进行比较
- Character:按照字符的Unicode值来进行比较数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较
- Boolean:true 对应的包装类实例大于 false 对应的包装类实例
- Date、Time等:后面的日期时间比前面的日期时间大
注:实现Comparable接口的对象可以通过 Collections.sort 或Arrays.sort进行自动排序
三、方式二:定制排序
java.util.Comparator
- 情况:当元素类型没有实现Comparable接口而又不方便修改代码,或实现了Comparable接口但排序规则不适合当前的操作,那么可考虑用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较
- 结果:重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2
- 举例:与方式一中相同,此处省略;
- 创建ComparatorTest类用来测试:(比较名字首字母)
import java.util.Arrays; import java.util.Comparator; public class ComparatorTest { public static void main(String[] args) { Goods[] all = new Goods[4]; all[0] = new Goods("War and Peace", 100); all[1] = new Goods("Childhood", 80); all[2] = new Goods("Scarlet and Black", 140); all[3] = new Goods("Notre Dame de Paris", 120); Arrays.sort(all, new Comparator() { @Override public int compare(Object o1, Object o2) { Goods g1 = (Goods) o1; Goods g2 = (Goods) o2; return g1.getName().compareTo(g2.getName()); } }); System.out.println(Arrays.toString(all)); } }
运行结果:
[Goods{name='Childhood', price=80.0}, Goods{name='Notre Dame de Paris', price=120.0}, Goods{name='Scarlet and Black', price=140.0}, Goods{name='War and Peace', price=100.0}]
四、两种方式比较
Comparable接口的方式一旦确定,保证Comparable接口实现类的对象在任何位置都可以比较大小而Comparator接口属于临时性的比较
到此这篇关于Java实现对象排序的两种方式详解的文章就介绍到这了,更多相关Java对象排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!