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

成都市网站建设泉州关键词优化报价

成都市网站建设,泉州关键词优化报价,网站你懂我意思正能量晚上不用下载直接进入,中国有名的网站建设公司作者:~小明学编程 文章专栏:Java数据结构 格言:目之所及皆为回忆,心之所想皆为过往 目录 问题引入 offer() 扩容 构造方法 grow() siftUp() siftUpComparable() 问题引入 问题是这样的&#xff0c…

作者~小明学编程 

文章专栏Java数据结构

格言目之所及皆为回忆,心之所想皆为过往

目录

问题引入

offer()

扩容

构造方法

grow()

siftUp()

siftUpComparable()


问题引入

问题是这样的,我们现在有一个类,这个类是一个扑克牌的类,类里面有我们的花色和数字,现在我们有一个优先级的队列,我们向队列里面offer()元素,这时问题就来了,我们怎么才能让我们堆里面的对象按照我们想要的方式进行排序呢?

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 + '\'' +'}';}
}public class Test {public static void main(String[] args) {//默认是一个小堆PriorityQueue<Card> priorityQueue = new PriorityQueue<>();Card card1 = new Card(2,"♠");Card card2 = new Card(3,"♠");priorityQueue.offer(new Card(5,"♥"));priorityQueue.offer(new Card(2,"♠"));System.out.println(priorityQueue);
//        System.out.println(card1.compareTo(card2));}
}

只是我们最开始的代码,我们打算向我们的堆里面放入我们的card。

 然后当我们运行代码的时候,发现会报错,具体因为啥下面详细说,现在我们要明白的是,既然想向我们的堆里面放东西你总得有个顺序,所以我们这里要写一个比较方法,这个时候就需要我们实现 Comparable接口然后重写我们的 compareTo 方法。

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 + '\'' +'}';}
}

 可以看到这里我们就实现了从小到大的排序,那么这个过程是怎么实现的呢?

offer()

    public boolean offer(E e) {if (e == null)throw new NullPointerException();modCount++;int i = size;if (i >= queue.length)grow(i + 1);size = i + 1;if (i == 0)queue[0] = e;elsesiftUp(i, e);return true;}

这就是我们的源码,我们可以看到,类型的话是一个泛型,e是我们当前传进去的对象,首先会有一个判断,如果e为空那么就直接抛出一个异常。

扩容

 接下来就是一个判断当前数组元素个数并且考虑是否需要扩容的问题了,当我们的i>=queue.length的时候就需要grow()了,所以现在我们需要知道这个数组的初始值是多大。

构造方法

 当我们创建对象的时候我们是没给对象传参数的,所以我们将会调用我们的无参构造方法,然后通过this()传了两个参数,调用我们带两个参数的构造方法,再下面就是new了一个Object[]类型的数组,数组的大小是 DEFAULT_INITIAL_CAPACITY = 11 ,comparator是null。

grow()

    private void grow(int minCapacity) {int oldCapacity = queue.length;// Double size if small; else grow by 50%int newCapacity = oldCapacity + ((oldCapacity < 64) ?(oldCapacity + 2) :(oldCapacity >> 1));// overflow-conscious codeif (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);queue = Arrays.copyOf(queue, newCapacity);}

这里的源码很容易理解,首先确定一下旧的数组大小也就是oldCapacity,我们新的大小为:

如果我们旧的数组的大小小于64,新的数组的大小就为2*oldCapacity+2,反之新数组的大小就为1.5*oldCapacity。

完成扩容时候就该往数组里放元素了。

 当我们是第一次向里面放元素时,也就是i==0,queue[0] = e。

当我们不是第一个元素的时候,例如我们放第二个元素,此时的i==1,我们进入siftUp()。

siftUp()

    private void siftUp(int k, E x) {if (comparator != null)siftUpUsingComparator(k, x);elsesiftUpComparable(k, x);}

在我们进入shfiUp()之后,会进行一个判断,因为我们的comparator是null,所以我们继续调用

siftUpComparable(k, x) 这个方法,

siftUpComparable()

    private void siftUpComparable(int k, E x) {Comparable<? super E> key = (Comparable<? super E>) x;while (k > 0) {int parent = (k - 1) >>> 1;Object e = queue[parent];if (key.compareTo((E) e) >= 0)break;queue[k] = e;k = parent;}queue[k] = key;}

源码的大致思路是这样的,k为我们添加元素的个数-1,也就是数组的下标,找到我们的双亲节点

 key就是我们当前传进去的x,然后  key.compareTo((E) e)  因为我们重写了compareTo,所以这里直接接受 this.rank - o.rank 的返回值,也就是e2.rank - e1.rank此时等于-3<0,所以向下执行,

queue[k] = e

 k = parent  然后我们的k==0退出循环

queue[k] = key

http://www.dtcms.com/wzjs/410466.html

相关文章:

  • 网上做网站 干对缝儿生意郑州网站seo推广
  • 科普文章在那个网站做郑州seo外包费用
  • 网站做多宽网站推广方案有哪些
  • 什么犁网站做淘宝门头品牌网站建设解决方案
  • 英特尔nuc做网站服务器最好的网站推广软件
  • 网站建设多少钱一年友链申请
  • 做酒店需要怎么上网站百度后台登陆入口
  • 山西太原网站建设公司哪家好关键词林俊杰
  • 网站建设中关村外链推广网站
  • 真人性做爰直播网站免费关键词排名优化软件
  • 建设网站用凡科怎么样网站制作公司哪家好
  • php做原生直播网站软文广告经典案例800字
  • 设计类素材网站网站seo属于什么专业
  • php网站开发答案免费发布信息网网站
  • 网站建设硬件需求网络推广是做什么工作
  • 网站开发售后服务承诺快手流量推广网站
  • 教程建设网站seo页面优化技术
  • 国外购物网站推荐免费发布平台
  • 招商加盟网站模板程序滨州网站建设
  • 做led视频好的网站win7系统优化大师
  • 赣州哪里做网站会计培训班要多少钱
  • 做网站需要空间跟域名吗怎么登录百度app
  • 融水做的比较好的网站有哪些企业网站优化排名
  • 做网站用c 还是js黑帽seo排名优化
  • 有什么做论文的网站如何营销
  • 牙科医院网站设计怎么做网页设计成品源代码
  • 做外贸需关注的网站网络推广外包内容
  • 免费个人博客网站自动收录
  • 衡水网站网站建设网站seo优化是什么意思
  • 找人做网站去哪里找爱站网长尾挖掘工具