自然排序Comparable接口得使用举例:
1、像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了两个对象大小;
2、像String、包装类重写compareTo()方法以后,进行了从小到大的排列
3、重写compareTo()的规则:
如果当前对象this大于形参对象obj,则返回正整数,
如果当前对象this小于形参对象obj,则返回负整数,
如果当前对象this等于形参对象obj,则返回零。
4、对于自定义类,需要排序,可以用自定义类实现Comparable接口,重写comparaTo()方法。
代码:
package com.ComparableTest;import org.junit.Test;import java.util.Arrays;public class CompareTest {@Testpublic void test1(){String[] arr = new String[]{"AA","CC","MM","KK","GG","JJ","DD"};Arrays.sort(arr);System.out.println(Arrays.toString(arr));}@Testpublic void test2(){Goodss[] arr = new Goodss[5];arr[0] = new Goodss("lianxiangMouse",34);arr[1] = new Goodss("dellMouse",43);arr[2] = new Goodss("xiaomiMouse",12);arr[3] = new Goodss("huaweiMouse",65);arr[4] = new Goodss("microsoftMouse",43);Arrays.sort(arr);System.out.println(Arrays.toString(arr));}}package com.ComparableTest;public class Goodss implements Comparable{private String name;private double price;public Goodss() {}public Goodss(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public double getPrice() {return price;}@Overridepublic String toString() {return "Goodss{" +"name='" + name + '\'' +", price=" + price +'}';}// 指明商品比较大小的方式@Overridepublic int compareTo(Object o) {if(o instanceof Goodss){Goodss goods = (Goodss)o;// 输入的所有对象都是Object类或者其子类if(this.price > goods.price) {return 1;}else if (this.price < goods.price) {return -1;}else{return this.name.compareTo(goods.name);// 相等按字母排序}}throw new RuntimeException("传入数据类型一致");}}
注意构造器和get、toString等方法的快捷生成。
定制排序:
1、背景:当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用Comparator 的对象来排序。
2、 重写compare(Object o1,Object o2)方法,比较01和o2的大小:
相等返回0;01大返回正正是,01小返回负整数。
代码:
@Testpublic void test4(){Goodss[] arr = new Goodss[5];arr[0] = new Goodss("lianxiangMouse",34);arr[1] = new Goodss("dellMouse",43);arr[2] = new Goodss("xiaomiMouse",12);arr[3] = new Goodss("huaweiMouse",65);arr[4] = new Goodss("microsoftMouse",43);Arrays.sort(arr,new Comparator(){// 按产品名称从低到高,再按价格从高到低@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof Goodss && o2 instanceof Goodss){Goodss g1 = (Goodss) o1;Goodss g2 = (Goodss) o2;if(g1.getName().equals(g2.getName())) {return -Double.compare(g1.getPrice(),g2.getPrice());}else{return g1.getName().compareTo(g2.getName());}}throw new RuntimeException("输入的数据类型不一致");}});System.out.println(Arrays.toString(arr));}
两类接口对比:
Comparable接口的方式一旦指定,保证Comparable接口的实现类在任何位置都可以比较大小;
Coparator接口时临时性的比较
