当前位置: 首页 > 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/85209.html

相关文章:

  • 景区网站怎么做的友情链接交换教程
  • 企业网站的分类市场调研报告ppt模板
  • 查询建设用地规划许可证在哪个网站站长统计 网站统计
  • 网站客户端制作多少钱全媒体运营师培训机构
  • 有哪些网站可以做图片打赏凡科网免费建站
  • 绵阳个人网站建设seo网页优化培训
  • 织梦儿童早教教育培训网站模板天津seo排名费用
  • 网站服务器租用价格怎么算百度搜索引擎平台
  • 可以做很多个网站然后哭推广百度seo刷排名软件
  • 如何用家庭电脑做网站中国万网域名注册服务内容
  • 哈市哪里网站做的好关于新品牌的营销策划
  • 电动车网站建设什么是seo文章
  • tcga做多因素分析的网站网站优化有哪些类型
  • 手机3g门户首页上海比较好的seo公司
  • 专业网站建设阿里云怎么让某个关键词排名上去
  • 建设网站的工作步骤网站seo 优化
  • wordpress需要哪些插件seo如何快速出排名
  • soho的外贸网站网站推广100种方法
  • 张北县网站建设seo兼职工资一般多少
  • 微信商店小程序怎么弄巩义网站推广优化
  • 怎么下别人wordpress模板seo哪个软件好
  • javaweb可以做网站吗网页制作公司排名
  • 免费推广的软件站长工具seo综合查询源码
  • 做网站 服务器网页设计作品
  • 安徽省工程建设信息网网站网站建设合同
  • 可以做旅行计划的网站百度收录查询入口
  • 网站开发工程师应聘书范文700字站长工具seo优化
  • 信游天下网站建设建站平台
  • 衡水做网站建设网站网络优化外包
  • 做原油期货关注什么网站百度快速排名软件下载