java優先隊列PriorityQueue中Comparator的用法

2021-02-19 Java小白學心理
點擊藍色字免費訂閱,每天收到這樣的好信息



前言:最近有不少粉絲關注本公眾號。並且我已經成功開通了流量主同時會賺一點點廣告費,我打算每個月把這部分錢拿出來給大家買點書刊,算是給大家一點福利吧。大家想買什麼書掃描下方的加他拉你加群。最後,非常感謝大家的關注。

在使用java的優先隊列PriorityQueue的時候,會看到這樣的用法。

PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){  @Override  public int compare(Integer o1, Integer o2){    return o1.compareTo(o2);  }});

1)k>0,隊列長度大於0
2)parent = k - 1 >>> 1; 即(k-1)/2,表示最後一個非葉子節點的位置
3)e為父節點,x是入隊元素,x可以看做放在最後一個位置。如果compare(x, e) < 0,則執行元素往上走的方法。
註:在siftUp中,如果是最小堆,那麼應該是較小的元素往上走,如果是最大堆,則應該是較大的元素往上走。

由於源碼中新入隊元素x是在第1個參數的位置,因此最大/最小優先隊列主要根據第1個參數的大小關係來判斷。

int compare(Integer x, Integer e){  return x > e ? -1 : 1;}int compare(Integer x, Integer e){  return x < e ? -1 : 1; }

結論:

PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){  @Override  public int compare(Integer o1, Integer o2){    return o1 < o2 ? -1 : 1;      }});

我不在乎我的作品文章是被現在的人讀還是由子孫後代來讀。既然上帝花了六千年來等一位觀察者,我可以花上一個世紀來等待讀者。

相關焦點

  • 解讀 java 並發隊列 BlockingQueue
    燈塔君跟大家講:解讀 java 並發隊列 BlockingQueue最近得空,想寫篇文章好好說說 java 線程池問題,我相信很多人都一知半解的,包括我自己在仔仔細細看源碼之前,也有許多的不解,甚至有些地方我一直都沒有理解到位。
  • 基礎不牢地動山搖記住 Java 面試中常用的八種排序算法與代碼實現
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫1.直接插入排序經常碰到這樣一類排序問題:把新的數據插入到已經排好的數據列中。
  • Java 枚舉(enum) 詳解7種常見的用法
    在實際編程中,往往存在著這樣的「數據集」,它們的數值在程序中是穩定的,而且「數據集」中的元素是有限的。
  • Java中的多線程你只要看這一篇就夠了
    當某代碼並不持有監視器的使用權時(如圖中5的狀態,即脫離同步塊)去wait或notify,會拋出java.lang.IllegalMonitorStateException。也包括在synchronized塊中去調用另一個對象的wait/notify,因為不同對象的監視器不同,同樣會拋出此異常。
  • Java中的Set、List、Map的用法與區別
    集合中的對象不按特定的方式排序,並且沒有重複對象。Set接口主要實現了兩個實現類:HashSet:HashSet類按照哈希算法來存取集合中的對象,存取速度比較快TreeSet:TreeSet類實現了SortedSet接口,能夠對集合中的對象進行排序。
  • 黑馬程式設計師:Java學科-引用類型用法總結以遊戲為案例
    本文內容引用類型文章輸出能夠理解引用類型作為成員變量能夠理解引用類型作為方法參數能夠理解引用類型作為方法返回值類型一、引用類型用法總結在實際的開發當中,引用類型的使用是很重要和普遍的。ArrayList類我們都知道,查看API的話我們可以發現,實際上是java.utli.List 接口實現類。所以,當我們看見List接口作為參數或者返回值類型的時候,當然所以可以將ArratList的對象進行傳遞或者是返回。
  • Java中設置classpath、path、JAVA_HOME的作用?
    path:Windows系統執行命令時要搜尋的路徑在dos命令行中執行命令的時候,會先從當前路徑去找,如果找不到,就會到path路徑下去找比如我的jdk裝在D盤下,當我在C盤執行java -version的時候會出現找不到java命令的情況,設置path的目的就是當在
  • Java8 中用法優雅的 Stream,性能也「優雅」嗎?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫ava8的Stream API可以極大提高Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的代碼。那麼,Stream API的性能到底如何呢,代碼整潔的背後是否意味著性能的損耗呢?
  • Java中的 "弱" 引用有啥用?
    在實際開發中,我們可以通過把所有指向某個對象的referece置空來保證這個對象在下次GC運行的時候被回收,類似下面:Object c = new Car();      c=null; 但是,這樣做是一件很繁瑣並且違背GC自動回收原則的事。
  • He jumped the queue是說他在隊伍裡亂跳嗎?原來他是插隊!
    queue指的是「隊伍」的意思,jump則是「跳躍」,jump the queue指的就是插隊。同義可說cut the line(切進隊伍裡),也是插隊之意,不過jump the queue通常是指有人非常無禮地亂插隊時。
  • java集合詳解合集
    所以的集合類都位於java.util包下,後來為了處理多線程環境下的並發安全問題,java5還在java.util.concurrent包下提供了一些多線程支持的集合類。在學習Java中的集合類的API、編程原理的時候,我們一定要明白,"集合"是一個很古老的數學概念,它遠遠早於Java的出現。
  • java集合【6】——— Iterable接口
    JamException in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList
  • [博客更新]Java 中 final 關鍵詞的使用
    上一篇文章我們講了 java 中 static 關鍵字的使用,這裡再將一下 final 關鍵字的使用。final 在 java 中可以看做一個「終結者」,它可以定義類、定義方法和定義變量。method is final */System.out.println("我叫"+name+" 來自"+city+" 學號為"+id);}}publicclassFinalClassDemo{publicstaticvoid main(String[] args){}}就這樣吧博客文章地址:https://blog.sunriseydy.top/technology/code/java
  • 小眾又好聽的歌曲《Priority》,歌詞超有態度
    >I'm not stressing out但我也沒在緊張什麼I'll keep doing me我會一直做我自己Dressed up for myself為了我自己穿衣打扮I don't care who sees我不在乎誰會看I'm my, I'm my number one priority
  • 最全面的Java多線程用法解析
    最全面的java多線程用法解析,如果你對Java的多線程機制並沒有深入的研究,那麼本文可以幫助你更透徹地理解Java多線程的原理以及使用方法。1.創建線程在Java中創建線程有兩種方法:使用Thread類和使用Runnable接口。在使用Runnable接口時需要建立一個Thread實例。
  • Java之final關鍵字詳解
    前言針對Java語言中的final關鍵字,想必都不陌生了。本來主要是來對final做關鍵字做一個總結。final關鍵字用法修飾類當用final去修飾一個類的時候,表示這個類不能被繼承。注意:a.被final修飾的類,final類中的成員變量可以根據自己的實際需要設計為fianl。b. final類中的成員方法都會被隱式的指定為final方法。說明:在自己設計一個類的時候,要想好這個類將來是否會被繼承,如果可以被繼承,則該類不能使用fianl修飾,在這裡呢,一般來說工具類我們往往都會設計成為一個fianl類。在JDK中,被設計為final類的有String、System等。
  • 阿里內部學習指南《Effective Java中文 第3版》程式設計師進階必備
    經典Jolt獲獎作品《Effective Java》的第3版這本書,對上一版內容進行了徹底的更新,介紹了如何充分利用從泛型到枚舉、從註解到自動裝箱的各種特性,幫助讀者更加有效地使用Java程式語言及其基本類庫:java.lang. java.util和java.io,以及子包,如java.util. concurrent和java.util.function等。