最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法

 更新時(shí)間:2023年08月10日 10:23:11   作者:你的代碼沒bug  
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java中優(yōu)先隊(duì)列PriorityQueue的使用

簡(jiǎn)單使用

PriorityQueue<Integer> p = new PriorityQueue<>();

優(yōu)先級(jí)隊(duì)列從隊(duì)頭取元素,從隊(duì)尾添加元素。

默認(rèn)情況下,隊(duì)列中的數(shù)據(jù)是升序排序。

PriorityQueue<Integer> p = new PriorityQueue<>();
p.offer(5);
p.offer(1);
p.offer(3);
p.offer(6);
p.offer(8);
while(!p.isEmpty()) {
	System.out.println(p.poll());
}

運(yùn)行結(jié)果:

1
3
5
6
8

方法

和隊(duì)列的方法基本一樣

自定義排序規(guī)則

以下代碼改變排序規(guī)則,從大到小:

PriorityQueue<Integer> queue=new PriorityQueue<>((o1,o2)->o2-o1);
PriorityQueue<Integer> queue= new PriorityQueue<>(Comparator.reverseOrder());

根據(jù)HashMap的value值對(duì)HashMap的鍵值對(duì)排序

public static void main(String[] args) {
	HashMap<Integer, Integer> map = new HashMap<>();
	map.put(1, 2);
	map.put(3, 4);
	map.put(5, 6);
	Set<Map.Entry<Integer, Integer>> entries = map.entrySet();//獲取鍵值對(duì)
	//自定義優(yōu)先隊(duì)列的排序規(guī)則,隊(duì)列內(nèi)存放的數(shù)據(jù)類型是鍵值對(duì)
	//o1,o2都是鍵值對(duì)這樣的對(duì)象
	PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> {
		return o1.getValue() - o2.getValue();//根據(jù)值升序排序
	});
	for (Map.Entry<Integer, Integer> entry : entries) {
		queue.offer(entry);//將鍵值對(duì)放到優(yōu)先隊(duì)列中
    }
	while(!queue.isEmpty()) {
		System.out.println(queue.poll().getValue());
	}
}

運(yùn)行結(jié)果:

2
4
6

優(yōu)先隊(duì)列PriorityQueue (大根堆/小根堆/TopK問題)

PriorityQueue是從JDK1.5開始提供的新的數(shù)據(jù)結(jié)構(gòu)接口,它是一種基于優(yōu)先級(jí)堆的極大優(yōu)先級(jí)隊(duì)列。優(yōu)先級(jí)隊(duì)列是不同于先進(jìn)先出隊(duì)列的另一種隊(duì)列。每次從隊(duì)列中取出的是具有最高優(yōu)先權(quán)的元素。

默認(rèn)情況下,PriorityQueue是小頂堆,如代碼所示

public static void main(String[] args) {
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        queue.offer(5);
        queue.offer(6);
        while (!queue.isEmpty()){
            System.out.print(queue.poll() + " ");
        }
    }

輸出結(jié)果:

我們也可以通過以下方式來構(gòu)造大頂堆

public static void main(String[] args) {
  PriorityQueue<Integer> queue = new PriorityQueue<>((o1,o2) -> o2 - o1);//降序
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        queue.offer(5);
        queue.offer(6);
        while (!queue.isEmpty()){
            System.out.print(queue.poll() + " ");
        }
    }

輸出結(jié)果:

Top K問題,力扣347和力扣692:

力扣347:給你一個(gè)整數(shù)數(shù)組  nums  和一個(gè)整數(shù)  k  ,請(qǐng)你返回其中出現(xiàn)頻率前  k  高的元素。你可以按 任意順序 返回答案。

示例:

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]

代碼如下:注意構(gòu)造小頂堆的時(shí)候(o1,o2)-> o1.getValue() - o2.getValue() 不能省略。

public int[] topKFrequent(int[] nums, int k) {
        //key為元素值,value為出現(xiàn)頻率
        HashMap<Integer,Integer> map = new HashMap<>();
        PriorityQueue<Map.Entry<Integer, Integer>> queue 
        = new PriorityQueue<>((o1,o2)-> o1.getValue() - o2.getValue());
        int[] res = new int[k];
        for (int num : nums) {
            map.put(num,map.getOrDefault(num,0) + 1);
        }
        Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
        for (Map.Entry<Integer, Integer> entry : entries) {
            queue.offer(entry);
            if(queue.size() > k){
                queue.poll();
            }
        }
        //留下的都是出現(xiàn)頻率最高的
        for(int i = 0; i < k; i++){
            Map.Entry<Integer, Integer> poll = queue.poll();
            res[i] = poll.getKey();
        }
        return res;

力扣692:給定一個(gè)單詞列表 words 和一個(gè)整數(shù) k ,返回前 k 個(gè)出現(xiàn)次數(shù)最多的單詞。返回的答案應(yīng)該按單詞出現(xiàn)頻率由高到低排序。如果不同的單詞有相同出現(xiàn)頻率, 按字典順序排序。

示例:

輸入: words = ["i", "love", "leetcode", "i", "love", "coding"], k = 2
輸出: ["i", "love"]
解析: "i" 和 "love" 為出現(xiàn)次數(shù)最多的兩個(gè)單詞,均為2次。注意,按字母順序 "i" 在 "love" 之前。

這題比上題難一點(diǎn),因?yàn)楫?dāng)兩個(gè)單詞出現(xiàn)次數(shù)一致時(shí)還要考慮按字典序排序,其次是答案需要從高到底排序,這里主要體現(xiàn)在優(yōu)先隊(duì)列PriorityQueue的構(gòu)造上。

代碼如下:

public List<String> topKFrequent(String[] words, int k) {
        List<String> res = new ArrayList<>();
        //key為元素,value為出現(xiàn)頻率
        HashMap<String,Integer> map = new HashMap<>();
        for (String word : words) {
            map.put(word,map.getOrDefault(word,0) + 1);
        }
        PriorityQueue<Map.Entry<String,Integer>> queue = new PriorityQueue<>(
                ((o1, o2) -> {
                    if(o1.getValue() == o2.getValue()){
                        return o2.getKey().compareTo(o1.getKey());
                    }
                    return o1.getValue() - o2.getValue();
                })
        );
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            queue.offer(entry);
            if(queue.size() > k){
                queue.poll();
            }
        }
        for(int i = 0; i < k; i++){
            res.add(queue.poll().getKey());
        }
        Collections.reverse(res);
        return res;
    }

注意o2.getKey().compareTo(o1.getKey())是按字典倒序,為什么要這么做呢,是因?yàn)槲覀冞@里用到小頂堆,所以每次poll出來的都是最小頻率元素,最后需要reverse一下,為了配合這個(gè),所以我們構(gòu)造優(yōu)先隊(duì)列的時(shí)候采用字典倒序。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計(jì)模式中的設(shè)計(jì)原則之合成復(fù)用原則詳解

    Java設(shè)計(jì)模式中的設(shè)計(jì)原則之合成復(fù)用原則詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式中的設(shè)計(jì)原則之合成復(fù)用原則詳解,原則是盡量使用合成/聚合的方式,而不是使用繼承聚合關(guān)系表示的是整體和部分的關(guān)系,整體與部分可以分開,可以理解為成員變量和當(dāng)前類的關(guān)系就是聚合關(guān)系,需要的朋友可以參考下
    2023-11-11
  • 關(guān)于Java中的CAS如何使用

    關(guān)于Java中的CAS如何使用

    這篇文章主要介紹了關(guān)于Java中的CAS如何使用,CAS是Compare And Swap(比較并交換)的縮寫,是一種非阻塞式并發(fā)控制技術(shù),用于保證多個(gè)線程在修改同一個(gè)共享資源時(shí)不會(huì)出現(xiàn)競(jìng)爭(zhēng)條件,從而避免了傳統(tǒng)鎖機(jī)制的各種問題,需要的朋友可以參考下
    2023-09-09
  • 深度理解Java中volatile的內(nèi)存語義

    深度理解Java中volatile的內(nèi)存語義

    前面我們已經(jīng)講過了volatile的作用、底層實(shí)現(xiàn)與內(nèi)存屏障,下面就總結(jié)一下整個(gè)流程,文中有非常詳細(xì)的介紹及圖文示例,需要的朋友可以參考下
    2021-06-06
  • Spring MVC--攔截器實(shí)現(xiàn)和用戶登陸例子

    Spring MVC--攔截器實(shí)現(xiàn)和用戶登陸例子

    本文主要介紹了Spring MVC--攔截器實(shí)現(xiàn)和用戶登陸例子,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • JMeter中的后端監(jiān)聽器的實(shí)現(xiàn)

    JMeter中的后端監(jiān)聽器的實(shí)現(xiàn)

    本文主要介紹了JMeter中的后端監(jiān)聽器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參)

    java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參)

    這篇文章主要介紹了java后端如何調(diào)用第三方接口(往header和body中的參數(shù)傳參),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java定時(shí)任務(wù)Timer、TimerTask與ScheduledThreadPoolExecutor詳解

    Java定時(shí)任務(wù)Timer、TimerTask與ScheduledThreadPoolExecutor詳解

    這篇文章主要介紹了Java定時(shí)任務(wù)Timer、TimerTask與ScheduledThreadPoolExecutor詳解,  定時(shí)任務(wù)就是在指定時(shí)間執(zhí)行程序,或周期性執(zhí)行計(jì)劃任務(wù),Java中實(shí)現(xiàn)定時(shí)任務(wù)的方法有很多,本文從從JDK自帶的一些方法來實(shí)現(xiàn)定時(shí)任務(wù)的需求,需要的朋友可以參考下
    2024-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的基礎(chǔ)概念和數(shù)據(jù)模型詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的基礎(chǔ)概念和數(shù)據(jù)模型詳解

    在現(xiàn)實(shí)生活中,有許多應(yīng)用場(chǎng)景會(huì)包含很多點(diǎn)以及點(diǎn)點(diǎn)之間的連接,而這些應(yīng)用場(chǎng)景我們都可以用即將要學(xué)習(xí)的圖這種數(shù)據(jù)結(jié)構(gòu)去解決。本文主要介紹了圖的基礎(chǔ)概念和數(shù)據(jù)模型,感興趣的可以了解一下
    2022-11-11
  • SpringBoot項(xiàng)目啟動(dòng)錯(cuò)誤:找不到或無法加載主類的三種解決方法

    SpringBoot項(xiàng)目啟動(dòng)錯(cuò)誤:找不到或無法加載主類的三種解決方法

    在開發(fā)SpringBoot應(yīng)用時(shí),經(jīng)??赡軙?huì)遇到一個(gè)啟動(dòng)錯(cuò)誤:“錯(cuò)誤:找不到或無法加載主類 com.example.controller.demo.DemoApplication”,本文將介紹三種解決這一問題的方法,需要的朋友可以參考下
    2024-10-10
  • Java?8中的Collectors?API介紹

    Java?8中的Collectors?API介紹

    這篇文章主要介紹了Java?8中的Collectors?API,Stream.collect()是Java?8的流API的終端方法之一。它允許我們對(duì)流實(shí)例中保存的數(shù)據(jù)元素執(zhí)行可變折疊操作,下文相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04

最新評(píng)論

远安县| 尖扎县| 曲麻莱县| 民勤县| 高州市| 和硕县| 介休市| 潢川县| 贵德县| 宝坻区| 柳河县| 尚志市| 庆元县| 如东县| 闽侯县| 安达市| 故城县| 曲麻莱县| 浪卡子县| 兰西县| 社会| 盘山县| 离岛区| 灌南县| 循化| 乌恰县| 茂名市| 河源市| 包头市| 皮山县| 龙门县| 福安市| 桃园县| 抚远县| 澄城县| 河池市| 嘉义市| 七台河市| 秀山| 宿迁市| 抚州市|