Comparable接口示例(集合方法测试三)

Comparable接口:

                    如果想要对某个集合元素之间实现比较,非自定义类可以通过工具类Collections中的sort()方法来实现自然排序(从小到大),自定义类必须通过实现Comparable<>接口且必须重写方法int compareTo(T t)自定义排序规则来实现排序,之后再调用Collections中的sort方法(sort()方法底层是元素调用compareTo(E e)方法与另外一个元素比较)来对几何元素实现排序。

                     升序规则(参照例二解释):

                           当前对象大于参数对象,返回大于0的数;当前对象小于参数对象,返回小于10的数;当前对象等于参数对象,返回0;return this-o

                     降序规则(参照例二解释):

                             参数对象大于当前对象,返回大于0的数;参数对象小于当前对象,返回小于0的数;当前对象等于参数对象,返回0;return o-this

                     例一:

                           package com.hyxy.collection;
                           import java.util.ArrayList;
                           import java.util.Collections;
                           import java.util.List;
                           public class TestComparable {
                               public static void main(String[] args) {
                                   List<Character> l=new ArrayList<Character>();
                                   for(int i=0;i<10;i++) {
                                       int num=(int)(Math.random()*26);
                                       l.add((char)(num+65));
                                   }
                                   System.out.println(l);//输出结果:[K, S, F, E, Q, N, P, W, S, J]
                                   Collections.sort(l);
                                   System.out.println(l);//输出结果:[E, F, J, K, N, P, Q, S, S, W]
                               }
                           }

                     例二:

                           //一自定义类Point

                           package com.hyxy.collection;
                           public class Point implements Comparable<Point>{
                               private int x;
                               private int y;
                               public Point() {}
                               public Point(int x, int y) {
                                   this.x = x;
                                   this.y = y;
                               }
                                   public int getX() {
                                      return x;
                               }
                               public void setX(int x) {
                                      this.x = x;
                               }
                               public int getY() {
                                       return y;
                               }
                               public void setY(int y) {
                                    this.y = y;
                               }
                               public String toString() {
                                       return "("+x+","+y+")";
                               }
                               public int compareTo(Point o) {
                                    return this.y-o.y; //按纵坐标升序排序
                               }

                           //测试Point类

                           package com.hyxy.collection;
                           import java.util.ArrayList;
                           import java.util.Collections;
                           import java.util.Comparator;
                           import java.util.List;
                           public class TestPoint {
                               public static void main(String[] args) {
                                   Point p0=new Point(1,3);
                                   Point p1=new Point(1,1);
                                   Point p2=new Point(1,4);
                                   Point p3=new Point(1,0);
                                   Point p4=new Point(1,2);
                                   List<Point> list=new ArrayList<Point>();
                                   list.add(p0);
                                   list.add(p1);
                                   list.add(p2);
                                   list.add(p3);
                                   list.add(p4);
                                   System.out.println(list);
                                   //输出结果:[(1,3), (1,1), (1,4), (1,0), (1,2)]
                                   Collections.sort(list);
                                   System.out.println(list);
                                   //输出结果:[(1,0), (1,1), (1,2), (1,3), (1,4)]
                               }
                           }

                    若在非自定义类(自定义类也可)中想要实现除了在自定义类中已经定义的CompareTo方法自定义排序,我们可以在使用该比较的类中写一个内部类其中重载一个sort方法,sort(List list,Comparator c),当调用此方法时,在运行时系统调用的比较方法将不再是自定义类中的ComepareTo方法,而是调用Comparator中的compare(E e,E e)方法去进行比较。

                     例三(Point类为例二中自定义Point类):

                           package com.hyxy.collection;
                           import java.util.ArrayList;
                           import java.util.Collections;
                           import java.util.Comparator;
                           import java.util.List;
                           public class TestPoint {
                               public static void main(String[] args) {
                                   Point p0=new Point(1,3);
                                   Point p1=new Point(1,1);
                                   Point p2=new Point(1,4);
                                   Point p3=new Point(1,0);
                                   Point p4=new Point(1,2);
                                   List<Point> list=new ArrayList<Point>();
                                   list.add(p0);
                                   list.add(p1);
                                   list.add(p2);
                                   list.add(p3);
                                   list.add(p4);
                                   System.out.println(list);//输出结果:[(1,3), (1,1), (1,4), (1,0), (1,2)]
                                   Collections.sort(list);
                                   MyComparator c=new TestPoint().new MyComparator();
                                   Collections.sort(list,c);
                                   System.out.println(list);//输出结果:[(1,0), (1,1), (1,2), (1,3), (1,4)]
                               }
                               public class MyComparator implements Comparator<Point>{
                                   public int compare(Point o1, Point o2) {
                                       return o1.getY()-o2.getY();
                                   }
                               }
                           }

                     可以将例三中的MyComparator类更简化一点,可以写成匿名内部类,可以使代码看起来更加简洁。

                           package com.hyxy.collection;
                           import java.util.ArrayList;
                           import java.util.Collections;
                           import java.util.Comparator;
                           import java.util.List;
                           public class TestPoint {
                               public static void main(String[] args) {
                                      Point p0=new Point(1,3);
                                      Point p1=new Point(1,1);
                                      Point p2=new Point(1,4);
                                      Point p3=new Point(1,0);
                                      Point p4=new Point(1,2);
                                      Point[] po=new Point[5];
                                      List<Point> list=new ArrayList<Point>();
                                      for(int i=0;i<5;i++) {
                                             list.add(po[i]);
                                      }
                                      System.out.println(list);//[(1,3), (1,1), (1,4), (1,0), (1,2)]
                                      Collections.sort(list,new Comparator<Point>(){
                                      public int compare(Point o1, Point o2) {
                                           return o1.getY()-o2.getY();
                                          }
                                      });
                                      System.out.println(list);//[(1,0), (1,1), (1,2), (1,3), (1,4)]
                                  }
                              }

练习:要求定义一个Circle类,实现按照圆半径从小到大排序,在测试类中,要求可以按照圆心距原点距离从小到大排序

自定义Circle类:

                           package com.hyxy.collection;
                           public class Circle implements Comparable<Circle>{
                                  private double r;
                                  private int x;
                                  private int y;
                                  public Circle() {}
                                  public Circle(double r, int x, int y) {
                                         this.r = r;
                                         this.x = x;
                                         this.y = y;
                                  }
                                  public double getR() {
                                         return r;
                                     }
                                  public void setR(double r) {
                                         this.r = r;
                                  }
                                  public int getX() {
                                         return x;
                                     }
                                  public void setX(int x) {
                                         this.x = x;
                                  }
                                  public int getY() {
                                         return y;
                                  }
                                  public void setY(int y) {
                                         this.y = y;
                                  }
                                  public String toString() {
                                         return "["+r+","+"("+x+","+y+")"+"]";
                                  }
                                  public int compareTo(Circle o) {
                                         return (int)(this.r-o.r);
                                  }
                              }

测试类:

                           package com.hyxy.collection;
                           import java.util.ArrayList;
                           import java.util.Collections;
                           import java.util.Comparator;
                           import java.util.List;
                           public class TestCircle {
                               public static void main(String[] args) {
                                      Circle c1=new Circle(3,2,2);
                                      Circle c2=new Circle(6,1,1);
                                      Circle c3=new Circle(2,3,3);
                                      List<Circle> li=new ArrayList<Circle>();
                                      li.add(c1);
                                      li.add(c2);
                                      li.add(c3);
                                      System.out.println(li);//输出结果:[[3.0,(2,2)], [6.0,(1,1)], [2.0,(3,3)]]
                                      Collections.sort(li);
                                      System.out.println(li);//输出结果:[[2.0,(3,3)], [3.0,(2,2)], [6.0,(1,1)]]
                                      Circle c4=new Circle(5,2,1);
                                      li.add(c4);
                                      System.out.println(li);//输出结果:[[2.0,(3,3)], [3.0,(2,2)], [6.0,(1,1)], [5.0,(2,1)]]
                                      Collections.sort(li, new Comparator<Circle>() {
                                             public int compare(Circle o1, Circle o2) {
                                                 return (int)Math.sqrt((o1.getX()*o1.getX()+o1.getY()*o1.getY()))-
                                                  (int)Math.sqrt((o2.getX()*o2.getX()+o2.getY()*o2.getY()));
                                             }
                                         });
                                      System.out.println(li);//输出结果:[[6.0,(1,1)], [3.0,(2,2)], [5.0,(2,1)], [2.0,(3,3)]]
                                  }
                              }

猜你喜欢

转载自blog.csdn.net/z774884795/article/details/81806113