自然排序
    Comparable接口得使用举例:
    1、像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了两个对象大小;
    2、像String、包装类重写compareTo()方法以后,进行了从小到大的排列
    3、重写compareTo()的规则:
    如果当前对象this大于形参对象obj,则返回正整数,
    如果当前对象this小于形参对象obj,则返回负整数,
    如果当前对象this等于形参对象obj,则返回零。
    4、对于自定义类,需要排序,可以用自定义类实现Comparable接口,重写comparaTo()方法。
    代码:

    1. package com.ComparableTest;
    2. import org.junit.Test;
    3. import java.util.Arrays;
    4. public class CompareTest {
    5. @Test
    6. public void test1(){
    7. String[] arr = new String[]{"AA","CC","MM","KK","GG","JJ","DD"};
    8. Arrays.sort(arr);
    9. System.out.println(Arrays.toString(arr));
    10. }
    11. @Test
    12. public void test2(){
    13. Goodss[] arr = new Goodss[5];
    14. arr[0] = new Goodss("lianxiangMouse",34);
    15. arr[1] = new Goodss("dellMouse",43);
    16. arr[2] = new Goodss("xiaomiMouse",12);
    17. arr[3] = new Goodss("huaweiMouse",65);
    18. arr[4] = new Goodss("microsoftMouse",43);
    19. Arrays.sort(arr);
    20. System.out.println(Arrays.toString(arr));
    21. }
    22. }
    23. package com.ComparableTest;
    24. public class Goodss implements Comparable{
    25. private String name;
    26. private double price;
    27. public Goodss() {
    28. }
    29. public Goodss(String name, double price) {
    30. this.name = name;
    31. this.price = price;
    32. }
    33. public String getName() {
    34. return name;
    35. }
    36. public double getPrice() {
    37. return price;
    38. }
    39. @Override
    40. public String toString() {
    41. return "Goodss{" +
    42. "name='" + name + '\'' +
    43. ", price=" + price +
    44. '}';
    45. }
    46. // 指明商品比较大小的方式
    47. @Override
    48. public int compareTo(Object o) {
    49. if(o instanceof Goodss){
    50. Goodss goods = (Goodss)o;// 输入的所有对象都是Object类或者其子类
    51. if(this.price > goods.price) {
    52. return 1;
    53. }else if (this.price < goods.price) {
    54. return -1;
    55. }else{
    56. return this.name.compareTo(goods.name);// 相等按字母排序
    57. }
    58. }
    59. throw new RuntimeException("传入数据类型一致");
    60. }
    61. }

    注意构造器和gettoString等方法的快捷生成。

    定制排序:
    1、背景:当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用Comparator 的对象来排序。
    2、 重写compare(Object o1,Object o2)方法,比较01和o2的大小:
    相等返回0;01大返回正正是,01小返回负整数。

    代码:

    1. @Test
    2. public void test4(){
    3. Goodss[] arr = new Goodss[5];
    4. arr[0] = new Goodss("lianxiangMouse",34);
    5. arr[1] = new Goodss("dellMouse",43);
    6. arr[2] = new Goodss("xiaomiMouse",12);
    7. arr[3] = new Goodss("huaweiMouse",65);
    8. arr[4] = new Goodss("microsoftMouse",43);
    9. Arrays.sort(arr,new Comparator(){
    10. // 按产品名称从低到高,再按价格从高到低
    11. @Override
    12. public int compare(Object o1, Object o2) {
    13. if(o1 instanceof Goodss && o2 instanceof Goodss){
    14. Goodss g1 = (Goodss) o1;
    15. Goodss g2 = (Goodss) o2;
    16. if(g1.getName().equals(g2.getName())) {
    17. return -Double.compare(g1.getPrice(),g2.getPrice());
    18. }else{
    19. return g1.getName().compareTo(g2.getName());
    20. }
    21. }
    22. throw new RuntimeException("输入的数据类型不一致");
    23. }
    24. });
    25. System.out.println(Arrays.toString(arr));
    26. }

    两类接口对比:
    Comparable接口的方式一旦指定,保证Comparable接口的实现类在任何位置都可以比较大小;
    Coparator接口时临时性的比较