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

网站建设衤金手指下拉10精准引流推广公司

网站建设衤金手指下拉10,精准引流推广公司,橙子建站网站,shafow网站是谁做的一、问题提出 前面讲了优先级队列,优先级队列在插入元素时有个要求:插入的元素不能是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.yidumall.com/news/96014.html

相关文章:

  • 如何将网站搭在阿里云上海百度推广电话
  • 微信模板怎么制作seo分析与优化实训心得
  • 微信公众号个人可以做网站么百度客服人工电话24
  • 中国农业建设网站北京网站优化平台
  • 专注外贸建站正规seo排名外包
  • 贵州七星关区疫情最新消息seo优化步骤
  • 成都网站建设价格seminar是什么意思
  • 专业做尼泊尔的旅行网站如何做seo优化
  • wordpress绑定外部域名久久seo正规吗
  • 制作网站比较大的几家公司推广官网
  • linux 如何做网站厦门seo搜索引擎优化
  • 保健品网站源代码怎样做网站的优化、排名
  • 怎么做二维码直接进入网站seo建站优化
  • 万网主体新增网站备案需要是滴么百度手机助手下载免费安装
  • 平顶山网站建设电话app推广方案
  • 网站开发的发展的前景免费引流推广怎么做
  • 番禺建设网站报价广州网站建设推荐
  • 网站首页 排版网上推广企业
  • 专业做网站的公司保定推广竞价账户托管
  • 国外儿童社区网站模板seo网站排名查询
  • 需要登陆的网站如何做爬虫十大技能培训机构排名
  • 基于php mysql的网站开发郑州专业的网站公司
  • 项目信息网站哪个好最近的新闻事件
  • 给个网站能用的2022百度网站排名怎么提高
  • 网络营销特点主要有哪些一键seo提交收录
  • 滨州内做网站系统的公司平台怎么推广
  • 广东营销网站建设免费做做网站
  • 贵阳百度做网站电话搜索引擎推广方案案例
  • 备案网站管理系统百度爱采购优化
  • 用什么做淘宝客网站好北京软件培训机构前十名