zoukankan      html  css  js  c++  java
  • Java基础教程:对象比较排序

    Java基础教程:对象比较排序

    转载请标明出处:http://blog.csdn.net/wangtaocsdn/article/details/71500500

    有时候需要对对象列表或数组进行排序,下面提供两种简单方式:

    快速开始

    Comparable接口

    public interface Comparable<T>

      此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

      实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。

      实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器

    比较规则

      1.最好使得e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值。因为在使用自然排序与 equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。实际上,所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序将值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)视为相等。

      2.从数学上讲,定义给定类 C 上自然排序的关系式 如下:

     

    方法一:将要排序的对象类实现Comparable<>接口。

    首先,创建学生类,我们将根据学生成绩对学生进行排序:

    /**
    *   学生类
    */
    class Student implements Comparable<Student>{
    
        String name;
        int age;
        int score;
    
        public Student(String name, int age,int score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }
    
        @Override
        public int compareTo(Studento) {
            // TODO Auto-generated method stub
            return this.age - o.age;
        }
    }
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ArrayList<Student> students = new ArrayList<>();
            students.add(new Student("大铭", 19, 89));
            students.add(new Student("来福", 26, 90));
            students.add(new Student("仓颉", 23, 70));
            students.add(new Student("王磊", 18, 80));
    
            System.out.println("排序前:");
            for (Student student : students) {
                System.out.println("姓名:"+student.name+" 年龄:"+student.age+" 成绩:"+student.score);
            }
    
            // 排序
            Collections.sort(students);
    
            System.out.println("排序后:");
            for (Student student : students) {
                System.out.println("姓名:"+student.name+" 年龄:"+student.age+" 成绩:"+student.score);
            }
        }
    }  

    同理,也可以根据对象的其他属性进行排序。

    方法二:使用Comparator匿名内部类实现。

    还是使用同一个例子,按成绩将学生排序:

    /**
    *   学生类
    */
    class Student {
    
        String name;
        int age;
        int score;
    
        public Student(String name, int age,int score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }
    }
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ArrayList<Student> students = new ArrayList<>();
            students.add(new Student("大铭", 19, 89));
            students.add(new Student("来福", 26, 90));
            students.add(new Student("仓颉", 23, 70));
            students.add(new Student("王磊", 18, 80));
    
            System.out.println("排序前:");
            for (Student student : students) {
                System.out.println("姓名:"+student.name+" 年龄:"+student.age+" 成绩:"+student.score);
            }
    
            Collections.sort(students,new Comparator<Student>() {
    
                @Override
                public int compare(Student o1, Student o2) {
                    // TODO Auto-generated method stub
                    return o1.age-o2.age;
                }
            });
    
            System.out.println("排序后:");
            for (Student student : students) {
                System.out.println("姓名:"+student.name+" 年龄:"+student.age+" 成绩:"+student.score);
            }
        }
    }

    也可以实现按对象属性将对象列表排序。

  • 相关阅读:
    洛谷3004 [USACO10DEC]宝箱Treasure Chest
    洛谷3778 [APIO2017]商旅
    洛谷4141消失之物——每个体积的角度
    洛谷2943 [USACO09MAR]清理Cleaning Up——转变枚举内容的dp
    bzoj1858[Scoi2010]序列操作
    poj1325机器工作——二分图最小点覆盖
    洛谷P1144——最短路计数
    poj3254二进制放牛——状态压缩DP
    poj1191棋盘分割——区间DP
    洛谷P1474货币系统——背包方案计数
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9023877.html
Copyright © 2011-2022 走看看