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

网站建设衤金手指下拉10百度今日数据

网站建设衤金手指下拉10,百度今日数据,青岛做网站,php网站开发面向对象教程一、问题提出 前面讲了优先级队列,优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较,为了简单起见,我们只是插入了Integer类型, 那优先级队列中能否插入自定义类型对象呢&#xf…

一、问题提出

前面讲了优先级队列,优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较,为了简单起见,我们只是插入了Integer类型,
在这里插入图片描述
那优先级队列中能否插入自定义类型对象呢?
在这里插入图片描述

class Card{public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}
}
public class TestDome {public static void main(String[] args) {PriorityQueue<Card> priorityQueue = new PriorityQueue<>();priorityQueue.offer(new Card(5,"♣"));priorityQueue.offer(null);System.out.println(priorityQueue);}
}

优先级队列底层使用堆,而向堆中插入元素时,为了满足堆的性质,必须要进行元素的比较,而此时Card是没有办
法直接进行比较的,因此抛出异常。
通过实践,我们发现在没有指定 某种排序规则时,是无法将自定义类型入队的。
至于 Comparable,可以参考这篇文章javaSE - 三个常用的接口(Comparable,Comparator,Cloneable)

回顾

关于 对象的比较来说:
1、equals 方法,比较的是对象,如果比较的两个对象不相同:返回 false,反之,返回true
2、比较大小
我们的 Comparable 和 compareTo 使用比较大小的。指定比较的方式

我们要去堆Card 这种类型的对象进行比较,那就要实现Comparable或者Comparator,然后指定比较的方式,进行比较
Card 这个类里面有rank 和 suit 两个属性,是根据rank 或者 suit 进行比较

方法一、实现Comparable 接口

例如:使用rank 进行比较
方法一: 实现Comparable 接口 【注意!实现结结构,是要重写接口内部的抽象方法的】

class Card implements Comparable<Card>{public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}@Overridepublic int compareTo(Card o) {return this.rank - o.rank;}@Overridepublic String toString() {return "Card{" +"rank=" + rank +", suit='" + suit + '\'' +'}';}
}
public class TestDome {public static void main(String[] args) {PriorityQueue<Card> priorityQueue = new PriorityQueue<>();priorityQueue.offer(new Card(5,"♣"));priorityQueue.offer(new Card(2,"♥"));System.out.println(priorityQueue);}}   

这里是引用

那么,问题来了。我们也没有看见 优先级队列调用 compareTo 啊?
这里我们就需要去看一下,PriorityQueue 的 原码。
既然,自定义类型的数据能放的进去,而且 其结果 是有序的。
那么,说明 offer 在添加 自定义元素时,肯定是比较了的。
所以,我们从 offer 入手。
在这里插入图片描述

方法二:创建一个比较器(类),用来实现 Comparator 接口。通过这个类,来确定比较的规则

方法一对类的倾入性太强了,也就是说,在Card这个类里面实现比较的方式,那这个比较的方式就不能改了,但是如果哪天我们不根据rank进行比较,先要通过suit进行比较,那这个累计就不能实现比较了
在这里插入图片描述
所以我们应该将比较的方式单独实现一个类,将不同的比较方式提出来,例如:
在这里插入图片描述

利用匿名内部类实现上面的Comparator ,就是利用匿名内部类试下比较器
在这里插入图片描述
使用 lambda 表达式 - 与上一种方法是等价的。
在这里插入图片描述

二、元素的比较

2.1、基本类型的比较

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

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、对象的比较

class Card {public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}
} 
public class TestPriorityQueue {public static void main(String[] args) {Card c1 = new Card(1, "♠");Card c2 = new Card(2, "♠");Card c3 = c1;//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指向的是同一个对象}
}

c1、c2和c3分别是Card类型的引用变量,上述代码在比较编译时:
c1 > c2 编译失败
c1== c2 编译成功
c1 < c2 编译失败
从编译结果可以看出,Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。 那为什么可以比较?
因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而
默认情况下调
用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地
址,但有些情况下该种比较就不符合题意。

我们也可以重写equal方法:

class Card {public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}@Overridepublic String toString() {return "Card{" +"rank=" + rank +", suit='" + suit + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Card card = (Card) o;return rank == card.rank && Objects.equals(suit, card.suit);}@Overridepublic int hashCode() {return Objects.hash(rank, suit);}
}public class TestDome {public static void main(String[] args) {Card card1 = new Card(5,"♥");Card card2 = new Card(5,"♥");System.out.println(card1.equals(card2));}}

在这里插入图片描述
注意: 一般覆写 equals 的套路就是上面演示的

  1. 如果指向同一个对象,返回 true
  2. 如果传入的为 null,返回 false
  3. 如果传入的对象类型不是 Card,返回 false
  4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌
  5. 注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较
    覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行
    比较。

2.3、三种方式对比

在这里插入图片描述

http://www.khdw.cn/news/59281.html

相关文章:

  • 广州网站建设app开发淄博seo
  • c 做网站如何调用dll免费建站网站一站式
  • 南京代做网站上海搜索引擎优化公司排名
  • 做淘宝这种网站网站建设公司地址在哪
  • 苹果手机免费做ppt模板下载网站网站域名查询地址
  • phpstudy 做网站青岛建站seo公司
  • 广州网站建设360元整站优化系统厂家
  • c2c网站有哪些平台百度竞价怎么操作
  • 人才网最新招聘电脑系统优化软件哪个好用
  • 微网站设计基本要求电脑优化是什么意思
  • 制作网站背景怎么做微信怎么推广
  • 外包加工网靠谱吗谷歌seo和百度seo区别
  • 包头建设厅官方网站百度搜索引擎营销如何实现
  • 网站做图片的大小中国十大电商平台
  • html5手机网站分辩率上优化seo
  • 网站这么做优化网络推广哪个平台效果最好
  • 怎样在阿里巴巴上做网站微信营销平台系统
  • 最好用的cmsseo网络排名优化哪家好
  • 邢台做网站的那好国内打开google网页的方法
  • 加强网站建设和维护工作如何引流与推广
  • 做网站营业执照经营范围怎么填写软件培训
  • 新建网站如何让百度收录网上营销怎么做
  • 黑客黑网站是做网站如何统计网站访问量
  • 百事通做网站网站关键词有哪些
  • 做网站网页的软件是绿色的图标什么河南公司网站建设
  • 成立网站要多少钱巢湖网站制作
  • app推广放单平台西宁网站seo
  • 那个网站做图片怎么样在百度上免费推广
  • 30_10_郑州网站制作缅甸今日新闻
  • 注册域名 不建网站百度竞价排名怎么靠前