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

网站建设做网站需要多少钱/广州企业推广

网站建设做网站需要多少钱,广州企业推广,ui在线设计网站,如何承接设计网站建设目录 1. 元素的比较 1.1 基本类型的比较 1.2 对象比较的问题 2. 对象的比较 2.1 覆写基类的equals 2.2 基于Comparble接口类的比较 2.3 基于比较器比较 2.4 三种比较方式 3. 集合框架中PriorityQueue的比较方式 4. top-k问题 4.1 使用PriorityQueue创建大小堆,解决T…

目录

1. 元素的比较

1.1 基本类型的比较

1.2 对象比较的问题

2. 对象的比较

2.1 覆写基类的equals

2.2 基于Comparble接口类的比较

2.3 基于比较器比较

2.4 三种比较方式

3. 集合框架中PriorityQueue的比较方式

4. top-k问题

4.1 使用PriorityQueue创建大小堆,解决TOPK问题

4.2 例题

解题思路


1. 元素的比较

1.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);
}

1.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指向的是同一个对象}
}
c1c2c3分别是Card类型的引用变量,上述代码在比较编译时:
c1 > c2 编译失败
c1== c2 编译成功
c1 < c2 编译失败
从编译结果可以看出,Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。 那为什么==可以比较?
因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地,但有些情况下该种比较就不符合题意。
// Object中equal的实现,可以看到:直接比较的是两个引用变量的地址
public boolean equals(Object obj) {return (this == obj);
}

2. 对象的比较

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

2.1 覆写基类的equals

public class Card {public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}@Overridepublic boolean equals(Object o) {// 自己和自己比较if (this == o) {return true;}// o如果是null对象,或者o不是Card的子类if (o == null || !(o instanceof Card)) {return false;}// 注意基本类型可以直接比较,但引用类型最好调用其equal方法Card c = (Card)o;return this.rank == c.rank && suit.equals(c.suit);}
}
【注意】 一般覆写 equals 的套路就是上面演示的
1. 如果指向同一个对象,返回 true
2. 如果传入的为 null,返回 false
3. 如果传入的对象类型不是 Card,返回 false
4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌
5. 注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较,覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较

2.2 基于Comparble接口类的比较

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:
public interface Comparable<E> {// 返回值:// < 0: 表示 this 指向的对象小于 o 指向的对象// == 0: 表示 this 指向的对象等于 o 指向的对象// > 0: 表示 this 指向的对象大于 o 指向的对象int compareTo(E o);
}
对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写compareTo方法。
public class Card implements Comparable<Card> {public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}// 根据数值比较,不管花色// 这里我们认为 null 是最小的@Overridepublic int compareTo(Card o) {if (o == null) {return 1;}return rank - o.rank;}public static void main(String[] args){Card p = new Card(1, "♠");Card q = new Card(2, "♠");Card o = new Card(1, "♠");System.out.println(p.compareTo(o)); // == 0,表示牌相等System.out.println(p.compareTo(q)); // < 0,表示 p 比较小System.out.println(q.compareTo(p)); // > 0,表示 q 比较大}
}
Compareblejava.lang中的接口类,可以直接使用。

2.3 基于比较器比较

按照比较器方式进行比较,具体步骤如下:
用户自定义比较器类,实现Comparator接口
public interface Comparator<T> {// 返回值:// < 0: 表示 o1 指向的对象小于 o2 指向的对象// == 0: 表示 o1 指向的对象等于 o2 指向的对象// > 0: 表示 o1 指向的对象等于 o2 指向的对象int compare(T o1, T o2);
}
【注意】区分ComparableComparator
覆写Comparator中的compare方法
import java.util.Comparator;
class Card {public int rank; // 数值public String suit; // 花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}
}class CardComparator implements Comparator<Card> {// 根据数值比较,不管花色// 这里我们认为 null 是最小的@Overridepublic int compare(Card o1, Card o2) {if (o1 == o2) {return 0;}if (o1 == null) {return -1;}if (o2 == null) {return 1;}return o1.rank - o2.rank;}public static void main(String[] args){Card p = new Card(1, "♠");Card q = new Card(2, "♠");Card o = new Card(1, "♠");// 定义比较器对象CardComparator cmptor = new CardComparator();// 使用比较器对象进行比较System.out.println(cmptor.compare(p, o)); // == 0,表示牌相等System.out.println(cmptor.compare(p, q)); // < 0,表示 p 比较小System.out.println(cmptor.compare(q, p)); // > 0,表示 q 比较大}
}

【注意】Comparatorjava.util 包中的泛型接口类,使用时必须导入对应的包

2.4 三种比较方式

覆写的方法
说明
Object.equals
因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与
Comparable.compareTo
需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于
内部顺序
Comparator.compare
需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

3. 集合框架中PriorityQueue的比较方式

集合框架中的PriorityQueue底层使用堆结构,因此其内部的元素必须要能够比大小,PriorityQueue采用了: Comparble和Comparator两种方式。
1. Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接口,并覆写compareTo方法
2. 用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现Comparator接口并覆写compare方法。

4. top-k问题

top-k问题:最大或者最小的前k个数据。比如:世界前500强公司

4.1 使用PriorityQueue创建大小堆,解决TOPK问题

//使用比较器创建小根堆
class LessIntComp implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}
}//使用比较器创建大根堆
class GreaterIntComp implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}
}public class TestDemo<E> {//求最小的K个数,通过比较器创建大根堆public static int[] smallestK(int[] array, int k) {if(k <= 0) {return new int[k];}GreaterIntComp greaterCmp = new GreaterIntComp();PriorityQueue<Integer> maxHeap = new PriorityQueue<>(greaterCmp);//先将前K个元素,创建大根堆for(int i = 0; i < k; i++) {maxHeap.offer(array[i]);}//从第K+1个元素开始,每次和堆顶元素比较for (int i = k; i < array.length; i++) {int top = maxHeap.peek();if(array[i] < top) {maxHeap.poll();maxHeap.offer(array[i]);}}//取出前K个int[] ret = new int[k];for (int i = 0; i < k; i++) {int val = maxHeap.poll();ret[i] = val;}return ret;}public static void main(String[] args) {int[] array = {4,1,9,2,8,0,7,3,6,5};int[] ret = smallestK(array,3);System.out.println(Arrays.toString(ret));}
}

4.2 例题

OJ:面试题 17.14. 最小K个数

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

解题思路

堆排序
堆排序即利用堆的思想来进行排序,总共分为两个步骤:
1. 建堆
升序:建大堆
降序:建小堆
2. 利用堆删除思想来进行排序
建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。
创建一个最大堆,将数组中的元素放入堆中,为了维持堆中只有k个元素,只要堆中元素大于k个,就将堆顶poll(最大堆的堆顶的最大的元素),最后创建一个数组接受堆中的元素。
    public int[] smallestK(int[] arr, int k) {// 1.改造JDK的最小堆为此时的最"大"堆Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});for (int i : arr) {queue.offer(i);if (queue.size() > k) {queue.poll();}}// 此时队列中保存了最小的k个数字int[] result = new int[k];for (int i = 0; i < k; i++) {result[i] = queue.poll();}return result;}
http://www.lbrq.cn/news/1755865.html

相关文章:

  • 杭州 网站建设 哪家强/seo和sem是什么意思啊
  • 网站横幅怎做/软文推广网站
  • 龙岗建设网站/济南网络优化厂家
  • 音视频娱乐网站开发商/好用的搜索引擎有哪些
  • 广州网站推广电话/谷歌浏览器下载官网
  • yw12777域名查询/seo教程seo优化
  • 关于公示网站建设的计划书/泰安做网站公司哪家比较好
  • 网站建设服务 杭州/建网站建设
  • 乌鲁木齐做企业网站/免费网站开发平台
  • 个人网页设计与实现ppt/互联网广告优化
  • 制作网站需要什么软件/seo外链建设的方法
  • 中卫市住房建设局网站/3seo
  • 天津平台网站建设报价/手机网站智能建站
  • 网站建设术语解释/今日油价最新
  • 做微网站需要域名吗/网络营销工具介绍
  • 58重庆网站建设/免费b2b平台推广
  • 汕头做网站优化哪家好/竞价排名的优缺点
  • 太原网站建设联系方式/郑州网站seo顾问
  • 信用湘潭网站/百度知道登录
  • 东莞市企业网站建设哪家好/seo网络推广哪家专业
  • 网站建设整改实施方案/今日头条新闻消息
  • 设计网站banner图片/各大网站收录查询
  • 注册表怎么做动态网站/品牌软文案例
  • 用python网站开发/知乎关键词搜索排名
  • 信阳做网站公司汉狮价格/百度竞价排名是什么方式
  • 网站seo关键词布局/东莞百度搜索优化
  • 公司网站建设/沈阳网站seo公司
  • 投资网站实名认证可以做吗/免费获客平台
  • 大学两学一做专题网站/it培训机构出来能找到工作吗
  • 济南国画网站济南网站建设公司/抖音搜索seo代理
  • AE MDX L6 L12 L18 电源手侧操作使用说明
  • 7月18日总结
  • 【问题解决】npm包下载速度慢
  • LVS实验
  • C++ - 仿 RabbitMQ 实现消息队列--sqlite与gtest快速上手
  • MybatisPlus由浅入深