比较器详解

比较器的使用优点:

1)比较器的实质就是重载比较运算符
2)比较器可以很好的应用在特殊标准的排序上,有较大的灵活性(比如我想先按照学生成绩升序排列,当两个学生成绩相等时,我想按照该学生的年龄降序排列)
3)比较器可以很好的应用在根据特殊标准排序的数据结构上,比如堆排序(PriorityQueue)

比较器的潜台词(重点)

 // 创建一个按照年龄升序排列的比较器
    public static class AgeAscendingComparator implements Comparator<Student>
    {
        // 潜台词: 返回负数的时候,o1排在前面
        // 返回正数的时候,o2排在前面
        // 等于0时,谁排在前面无所谓
        @Override
        public int compare(Student o1, Student o2) {
            return o1.age - o2.age;
        }
    }

比较器的使用案例一:PriorityQueue实现降序排列

分析:众所周知,PriorityQueue是默认按照升序排列的,如果要实现按照降序排序,则要用到比较器

public class Comp_heap
{
    public static void main(String[] args) 
    {
         PriorityQueue<Integer> heap =new PriorityQueue<>(new HeapDescendingComaparator());
         heap.add(10);
         heap.add(20);
         heap.add(200);
         heap.add(2);
         heap.add(30);
    }
    // 创建一个静态内部类,实现从大到小降序排列的比较器
    public static class HeapDescendingComaparator implements Comparator<Integer>
    {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2 - o1;
        }
    }
}

使用Comparator实现自定义排序

e.g :比如我想先按照学生成绩升序排列,当两个学生成绩相等时,我想按照该学生的年龄降序排列

先创建好实体类


package Pojo;

import lombok.Data;
import lombok.ToString;

@Data
public class Student {

    public int age;
    public String name;
    public int grade;


    public Student(int age, String name, int grade)
    {
        this.age = age;
        this.name = name;
        this.grade = grade;
    }
}

再创建Comparator_create类,在该类的内部新建一个静态内部类或者匿名内部类

使用静态内部类的方式实现


package basic;

import Pojo.Student;

import java.util.Arrays;
import java.util.Comparator;

public class Comparator_create {
    // 创建一个按照年龄升序排列的比较器
    public static class AgeAscendingComparator implements Comparator<Student>
    {
        // 潜台词: 返回负数的时候,o1排在前面
        // 返回正数的时候,o2排在前面
        // 等于0时,谁排在前面无所谓
        @Override
        public int compare(Student o1, Student o2) {
            return o1.age - o2.age;
        }
    }

    // 创建一个按照年龄降序排列的比较器
    public static class AgeDescendingComparator implements Comparator<Student>
    {
        // 潜台词: 返回负数的时候,o1排在前面
        // 返回正数的时候,o2排在前面
        // 等于0时,谁排在前面无所谓
        @Override
        public int compare(Student o1, Student o2) {
            return o2.age - o1.age;
        }
    }

    // 创建一个按照成绩降序排列,但是当成绩相等时按照学生年龄升序排列的比较器
    public static class DIYComparator implements Comparator<Student>
    {
        // 潜台词: 返回负数的时候,o1排在前面
        // 返回正数的时候,o2排在前面
        // 等于0时,谁排在前面无所谓
        @Override
        public int compare(Student o1, Student o2) {
            if (o2.grade - o1.grade == 0)
                return o1.age - o2.age;
            return o2.grade - o1.grade;
            // 下面是使用三目运算符替换掉上面的if else语句,代码更简洁
            //return (o2.grade - o1.grade == 0) ? (o1.age - o2.age) : (o2.grade - o1.grade) ;
        }
    }

    public static void main(String[] args) {
        Student student1 = new Student(10, "yxg", 99);
        Student student2 = new Student(40, "yxg2", 90);
        Student student3 = new Student(20, "yxg3", 91);
        Student student4 = new Student(25, "yxg4", 91);
        Student[] student = new Student[]{student2, student1, student3, student4};
        Arrays.sort(student, new DIYComparator());
        for (Student s : student)
        {
            System.out.println("age: " + s.age + ", grade: "+ s.grade + " , name: " + s.name  );
        }
    }

}

使用匿名内部类的方式实现(如果该比较器只被使用一次,使用匿名内部类实现能达到性能的最大化)


public static void main(String[] args) {
        Student student1 = new Student(10, "yxg", 99);
        Student student2 = new Student(40, "yxg2", 90);
        Student student3 = new Student(20, "yxg3", 91);
        Student student4 = new Student(25, "yxg4", 91);
        Student[] student = new Student[]{student2, student1, student3, student4};
        Arrays.sort(student, new Comparator<Student>() {
                    @Override
                    public int compare(Student o1, Student o2) {
                        return (o2.grade - o1.grade == 0) ? (o1.age - o2.age) : (o2.grade - o1.grade) ;
                    }
                });
        //Arrays.sort(student, new DIYComparator());
        for (Student s : student)
        {
            System.out.println("age: " + s.age + ", grade: "+ s.grade + " , name: " + s.name  );
        }

    }

如果比较器使用的比较多,超过一次,可以把他写成一个工具类

步骤:把静态内部类中的代码拷贝到新的类中,然后去掉static关键字即可

package utils;

public class AgeAscendingComparator implements Comparator<Student>
    {
        // 潜台词: 返回负数的时候,o1排在前面
        // 返回正数的时候,o2排在前面
        // 等于0时,谁排在前面无所谓
        @Override
        public int compare(Student o1, Student o2) {
            return o1.age - o2.age;
        }
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
离散LQR(线性二次调节)控制器是一种广泛应用于控制系统的优化控制方法。它通过在系统状态空间中定义一个成本函数,并最小化这个成本函数来设计控制器,以实现系统的性能优化。 离散LQR控制器的设计过程包含以下几个步骤: 1. 系统建模:首先,需要根据实际的控制系统确定系统的数学模型,并将其转换为状态空间表示。一般来说,这个模型可以使用差分方程或差分方程组来描述。 2. 定义成本函数:然后,需要定义一个成本函数,用来评估系统的性能。成本函数可以包括系统状态、控制输入或者其他相关指标。一般来说,成本函数是由系统性能指标和权重矩阵构成的二次型函数。 3. 计算最优控制器:通过解决离散时不变的Riccati方程,可以得到最优的状态反馈增益矩阵。这个增益矩阵可以将系统状态与控制输入相联系,以实现对系统的最优控制。 4. 性能评估:通过模拟系统的行为,可以评估控制器的性能。这可以通过计算成本函数的值来实现,从而比较不同控制器的优劣。 离散LQR控制器的优点是:它能够优化系统的性能,使得系统的稳定性、响应速度和鲁棒性都能得到改善。此外,离散LQR控制器的设计方法相对简单,容易实现和调整。 然而,离散LQR控制器也存在一些限制。首先,它要求系统的模型是线性的,并且能够被准确地表示为状态空间方程。其次,离散LQR控制器也对系统的测量精度和噪声等因素比较敏感。 总之,离散LQR控制器是一种基于状态反馈的优化控制方法,适用于线性离散系统。它可以通过最小化成本函数,设计出最优的控制器,从而提高系统的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值