关于这部分知识可以在集合那块说,但在这说一下也无伤大雅,就是两个接口的不同实现。
Comparable与Comparator
1.说明:
== != > < >= <=
① > < >= <= 适用于基本数据类型中的非boolean的7种
② == != 适用于基本数据类型和引用数据类型。
2.默认情况下,引用数据类型的变量是不可以比较大小的。但是在实际开发中,我们又有这样的需求。应该如何实现呢?
实现方法一:自然排序:Comparable
实现方法二:定制排序:Comparator
3. 自然排序:Comparable
① 要求待排序的对象所属的类必须实现Comparable
② 要重写接口中的compareTo(Object obj),指明如何排序(使用对象的属性进行比较,实现排序)
4. 定制排序:Comparator
① 创建实现了Comparator接口的实现类的对象
② 重写接口中的compare(Object o1,Object o2),指明如何排序(使用对象的属性进行比较,实现排序)
建一个Goods类实现Comparable接口并重写自然排序方法CompareTo()
public class Goods implements Comparable{ private String name; private double price; public Goods() { super(); } public Goods(String name, double price) { super(); 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 + "]"; } /** * 如何比较两个对象的大小,需要调用如下的方法 * * @return * 如果返回值为正数,表示调用此方法的对象大; * 如果返回值为负数,表示调用此方法的对象小; * 如果返回值为零,表示两个对象一样大 * * 按照价格从低到高排列,如果价格相同,再按照产品名称排列 */ @Override public int compareTo(Object o) { if(this == o){ return 0; } if(o instanceof Goods){ Goods g1 = (Goods)o; //先比较价格,再比较名称 if(Double.compare(this.price, g1.price) != 0){ return -Double.compare(this.price, g1.price); }else{ return this.name.compareTo(g1.name); } }else{ throw new RuntimeException("输入的类型不匹配"); } } }
测试自然排序:
@Test public void test2(){ Goods g1 = new Goods("samsumgnote10", 7999); Goods g2 = new Goods("huaweimate30", 5999); Goods g3 = new Goods("lenovo", 1999); Goods g4 = new Goods("xiaomi9", 2999); Goods g5 = new Goods("vivox27pro", 4999); Goods g6 = new Goods("oppofindx", 2999); Goods[] arr = new Goods[]{g1,g2,g3,g4,g5,g6}; for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } Arrays.sort(arr); System.out.println("排序以后:"); for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } }
定制排序(Comparator):
@Test public void test3(){ String[] arr = new String[]{"CC","DD","MM","AA","GG","JJ","ZZ"}; System.out.println(Arrays.toString(arr)); 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; return -s1.compareTo(s2); }else{ throw new RuntimeException("输入的类型不匹配"); } } }); System.out.println(Arrays.toString(arr)); }
注意@Test使用的是eclipse中的JUnit Test Case。
来源:https://blog.csdn.net/zxdspaopao/article/details/100801627