当前位置: 首页 > wzjs >正文

松江新城建设集团有限公司网站河南建设监理协会官方网站

松江新城建设集团有限公司网站,河南建设监理协会官方网站,网站设计 布局,托福培训一对一1. PriorityQueue中插入对象 上篇文章研究了优先级队列,优先级队列在插入元素中,要求插入的元素不能是null或者元素之间必须要能够进行比较,为了简单起见,上篇文章只是插入了Integer类型,那优先级队列中是否能插入自定…

1. PriorityQueue中插入对象

上篇文章研究了优先级队列,优先级队列在插入元素中,要求插入的元素不能是null或者元素之间必须要能够进行比较,为了简单起见,上篇文章只是插入了Integer类型,那优先级队列中是否能插入自定义类型的对象呢

有如下代码:

class Card {private int rank; //数值private String suit; //花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}
}public class Test {public static void TestForPriority() {PriorityQueue<Card> p = new PriorityQueue<>();p.offer(new Card(1, "♥"));p.offer(new Card(2, "♥"));}public static void main(String[] args) {TestForPriority();}
}

运行结果为:

原因在上篇文中也有所提及,优先级队列底层使用堆,而向堆中插入元素中,为了满足堆的性质(offer方法中会检测是否有比较器,如果没有比较器会强转为Compareable),必须要进行元素的比较,而此时自定义类型Card是没有办法直接进行比较的,所以会抛出上面的异常。

2. 元素的比较

2.1 基本类型的比较

Java中,基本类型的对象可以直接比较大小

public class TestCompare {public static void main(String[] args) {int a = 10;int b = 20;System.out.println(a > b);System.out.println(a < b);System.out.println(a == b);char c1 = 'A';char c2 = 'B';System.out.println(c1 > c2);System.out.println(c1 < c2);System.out.println(c1 == c2);boolean b1 = true;boolean b2 = false;System.out.println(b1 == b2);System.out.println(b1 != b2);}}

2.2 对象比较的问题

代码如下

如果在main方法中

有System.out.println(c1 > c2),会编译报错

有System.out.println(c1 == c2) 编译成功 --> 打印false 因为c1和c2指向不是同一个对象

有System.out.println(c1 < c2) 会编译报错

有System.out.println(c1 == c3) 编译成功 --> 打印true 因为c1 和 c3指向的是同一个对象

从上面的编译结果可以看出,Java中引用类型的变量不能直接按照 > 或者 < 进行比较 那 == 为什么可以呢?

对于自定义类型,都默认会继承自Object类而Object类中提供了equals方法,而 == 默认情况下使用的是equals方法,但是该方法的默认比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下这种比较并不符合题意。

下图为Object中equal的实现,可以看到:直接比较的是两个引用变量的地址

3. 对象的比较

有些情况下,需要比较的是对象中的内容,比如:向优先级队列中插入某个对象时,需要对按照对象中内容来调整 堆,那该如何处理呢?

3.1 覆写基类的equals方法

如图:在自定义类中重写equals方法

注意: 一般覆写 equals 的套路就是上面演示的

1. 如果指向同一个对象,返回 true

2. 如果传入的为 null,返回 false

3. 如果传入的对象类型不是 Card,返回 false

4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌

5. 注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较

重写equals方法虽然可以进行比较,但缺点是:equal方法的返回值是boolean类型,只能按照相等的比较,不能按照大于,小于的方式进行比较

3.2 基于Comparable接口类的比较

Comparable是JDK提供的泛型的比较接口类,源码实现为:

public interface Comparable<E> {

        //返回值:

        // < 0:表示this指向的对象小于 o 指向的对象

        // > 0:表示this指向的对象大于 o 指向的对象

        // == 0: 表示this指向的对象等于 o 指向的对象

        int compareTo(E o);

}

对于用户自定义类型,如果要按照自己的方式进行比较时: 在定义类的时候,实现Comparable接口,然后在类中重写compareTo方法即可

如下图:根据数值进行比较,不管花色,这里认为null是最小的

测试符合预期:

Comparable是java.lang中的接口类,可以直接使用。

3.3 基于比较器比较

具体实现步骤如下:

1. 用户自定义比较器类,实现Comparator接口

public interface Comparator<T> {

        // 返回值: // < 0: 表示 o1 指向的对象小于 o2 指向的对象

        // == 0: 表示 o1 指向的对象等于 o2 指向的对象

        // > 0: 表示 o1 指向的对象等于 o2 指向的对象

        int compare(T o1, T o2);

}

注意区分Comparable  和 Comparator

2.覆写Comparator中的compare方法

测试符合预期:

注意:Comparator是java.util包中的泛型接口类, 使用时必须导入对应的包。

3.4 三种方式的对比

补充解释第二和第三种比较方式:

2. Comparable.comparaTo:

例如代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;class Employee implements Comparable<Employee> {private String name;private int age;public Employee(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Employee other) {return Integer.compare(this.age, other.age);}public int getAge() {return age;}@Overridepublic String toString() {return "Employee{name='" + name + "', age=" + age + "}";}
}public class Main {public static void main(String[] args) {List<Employee> employees = new ArrayList<>();employees.add(new Employee("Alice", 25));employees.add(new Employee("Bob", 20));employees.add(new Employee("Charlie", 30));// 对员工列表进行排序Collections.sort(employees);for (Employee employee : employees) {System.out.println(employee);}}
}

2. Comparator.compare

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class Main {public static void main(String[] args) {List<Student> students = new ArrayList<>();students.add(new Student("Alice", 20));students.add(new Student("Bob", 18));students.add(new Student("Charlie", 22));// 创建比较器对象AgeComparator ageComparator = new AgeComparator();// 在排序算法中显式指定比较器Collections.sort(students, ageComparator);for (Student student : students) {System.out.println(student.getName() + " - " + student.getAge());}}
}

完!


文章转载自:

http://c330frxd.gmgnp.cn
http://4STxS2VJ.gmgnp.cn
http://qGnkkd8f.gmgnp.cn
http://kOQ7yl0k.gmgnp.cn
http://XKAa6xLb.gmgnp.cn
http://SDmGt88F.gmgnp.cn
http://hwn2Rq9w.gmgnp.cn
http://njyo8BJY.gmgnp.cn
http://AUEasNNl.gmgnp.cn
http://qyM0DI6g.gmgnp.cn
http://xL9AI6fa.gmgnp.cn
http://KHM7ILY2.gmgnp.cn
http://zUHJ8u3u.gmgnp.cn
http://LcKY4Ckm.gmgnp.cn
http://HnSnH3Pa.gmgnp.cn
http://9YRDqqCw.gmgnp.cn
http://2Bt5f5RS.gmgnp.cn
http://xClut0xb.gmgnp.cn
http://0VepxYED.gmgnp.cn
http://jGCEr0iB.gmgnp.cn
http://aQnDuQdZ.gmgnp.cn
http://HXDaWON9.gmgnp.cn
http://OCgO5UvS.gmgnp.cn
http://VS1olUbL.gmgnp.cn
http://fLf7TrFw.gmgnp.cn
http://aDJvNX13.gmgnp.cn
http://RMnBSEEn.gmgnp.cn
http://1Q1wxkpI.gmgnp.cn
http://SIc6auqV.gmgnp.cn
http://RLaylq2r.gmgnp.cn
http://www.dtcms.com/wzjs/648016.html

相关文章:

  • 家具网站设计网站wordpress 教育
  • 建设银行广西分行招聘网站个人电子商务网站建设方案
  • 我的世界建筑网站深圳营销型网站公司
  • 网站建设案例图片村网通为每个农村建设了网站
  • 工作准备区域的组成包括企业网站seo怎么做
  • 玉溪定制网站建设网页设计这个行业怎么样
  • 500亿网站建设免费软件库下载
  • 广西城乡建设名网站门窗 东莞网站建设
  • 主流网站开发技术框架美文网站源码
  • 阿尔山网站建设文化建设素材
  • 可以免费做3dLOGO的网站网络小说写作网站
  • 广州网站建设乐云seo模板中心江苏网站建设要多少钱
  • 无法进行网站备案百度站长平台链接提交
  • 江门网站推广想做网站选什么专业
  • 金科科技 做网站logo字体设计在线生成
  • 红酒 公司 网站建设手机网站页面尺寸大小
  • php网站开发开题报告iis建设个人网站
  • 高端品牌网站建设网站开发注意什么韩国导航地图app
  • 企业型网站建设怎样收费公司网站建设需要注意什么
  • 做网站的赢利点优化游戏性能的软件
  • dede网站 异步生成建设部网站申请表无法打印
  • 网站内容及实现的方式网页制作与设计电子书
  • 满城区城乡建设局网站好的手机端网站模板下载软件
  • 网站显示后台登陆链接晚上必看正能量网站短视频
  • 滨湖区建设局官方网站装修网站cms
  • 天津房地产网站建设网盘做网站服务器
  • 做的比较好的旅游网站昆山做企业网站
  • 4.请简述网站建设流程的过程简历表格 个人简历手机版
  • 哈尔滨做网站找哪家好高端网站建设公司好不好
  • 网站建设中心联系方式cms建设网站