Comparable 接口与Comparator的使用的对比
1 package com.yhqtv.java; 2 3 import org.junit.Test; 4 5 import java.util.Arrays; 6 import java.util.Comparator; 7 8 /* 9 * 一,说明:java中的对象,正常情况下,只能进行比较:==或!=,不能使用>或者<的 10 * 但是在开发场景中,我们需要对多个对象进行排序,言外之意,就是需要比较对象的大小。 11 * 如何实现?使用两个接口中的任何一个:Comparable或者Comparator 12 * 13 * 二、Comparable 接口与Comparator的使用的对比 14 * Comparable接口的方式一旦一定,保证Compa接口实现类的对象在任何位置都可以比较大小 15 * Comparator接口属于临时性的比较。 16 * 17 * @author XMKJ yhqtv.com Email:yhqtv@qq.com 18 * @create 2020-05-01-17:30 19 * 20 */ 21 public class CompareTest { 22 /* 23 * Comparable接口的使用举例: 24 * 1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式 25 * 2.像String、包装类重写compareTo()方法以后,进行了从小到大的排序 26 * 3.重写compareTo(obj)的规则: 27 * 如果当前对象this大于形参对象obj,则返回正整数, 28 * 如果当前对象this小于形参对象obj,则返回负数 29 * 如果当前对象this等于形参对象obj,则返回零 30 * 4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写 31 * compareTo(obj)方法。在compareTo(obj)方法中指明如何排序 32 * */ 33 @Test 34 public void test1() { 35 String[] arr = new String[]{"AA", "CC", "MM", "GG", "JJ", "DD", "LL"}; 36 Arrays.sort(arr); 37 System.out.println(Arrays.toString(arr)); 38 } 39 40 @Test 41 public void test2() { 42 Goods[] g = new Goods[4]; 43 g[0] = new Goods("火柴", 2.32); 44 g[1] = new Goods("联想", 1.32); 45 g[2] = new Goods("戴尔", 8.32); 46 g[3] = new Goods("苹果", 3.32); 47 48 Arrays.sort(g); 49 50 System.out.println(Arrays.toString(g)); 51 } 52 53 /* 54 * Comparator接口的使用:定制排序 55 * 1.背景 56 * 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 57 * 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作, 58 * 那么可以考虑使用Comparator的对象来排序 59 * 2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小; 60 * 如果方法返回正整数,则表示o1大于o2; 61 * 如果返回0,表示相等; 62 * 返回负整数,表示o1小于o2. 63 * */ 64 @Test 65 public void test3() { 66 String[] arr = new String[]{"AA", "CC", "MM", "GG", "JJ", "DD", "LL"}; 67 Arrays.sort(arr, new Comparator<String>() { 68 @Override 69 public int compare(String o1, String o2) { 70 if (o1 instanceof String && o2 instanceof String) { 71 String s1 = (String) o1; 72 String s2 = (String) o2; 73 74 return -s1.compareTo(s2); 75 } 76 77 // return 0; 78 throw new RuntimeException("输入数据类型不一致"); 79 } 80 }); 81 System.out.println(Arrays.toString(arr)); 82 } 83 84 @Test 85 public void test4() { 86 Goods[] g = new Goods[4]; 87 g[0] = new Goods("联想", 2.32); 88 g[1] = new Goods("联想", 1.32); 89 g[2] = new Goods("戴尔", 8.32); 90 g[3] = new Goods("苹果", 3.32); 91 92 Arrays.sort(g, new Comparator() { 93 // 指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到底排序 94 @Override 95 public int compare(Object o1, Object o2) { 96 if (o1 instanceof Goods && o2 instanceof Goods) { 97 Goods g1=(Goods)o1; 98 Goods g2=(Goods)o2; 99 if(g1.getName().equals(g2.getName())){ 100 return -Double.compare(g1.getPrice(),g2.getPrice()); 101 }else{ 102 return g1.getName().compareTo(g2.getName()); 103 } 104 } 105 throw new RuntimeException("输入数据类型不一致"); 106 } 107 }); 108 109 System.out.println(Arrays.toString(g)); 110 } 111 }
1 package com.yhqtv.java; 2 3 /* 4 * @author XMKJ yhqtv.com Email:yhqtv@qq.com 5 * @create 2020-05-01-18:09 6 * 7 */ 8 public class Goods implements Comparable{ 9 10 private String name; 11 private double price; 12 13 public Goods() { 14 } 15 16 public Goods(String name, double price) { 17 this.name = name; 18 this.price = price; 19 } 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 29 public double getPrice() { 30 return price; 31 } 32 33 public void setPrice(double price) { 34 this.price = price; 35 } 36 37 @Override 38 public String toString() { 39 return "Goods{" + 40 "name='" + name + '\'' + 41 ", price=" + price + 42 '}'; 43 } 44 // 指明商品比较大小的方式 45 @Override 46 public int compareTo(Object o) { 47 if(o instanceof Goods){ 48 Goods goods=(Goods) o; 49 // 方式一 50 if(this.price>goods.price){ 51 return 1; 52 }else if(this.price<goods.price){ 53 return -1; 54 }else { 55 return 0; 56 } 57 // 方式二; 58 // return Double.compare(this.price,goods.price); 59 } 60 // return 0; 61 throw new RuntimeException("传入的数据类型不一致!"); 62 } 63 }
版权声明:本文为yhqtv-com原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。