我們在一些特定場景下,例如查詢公司員工的最高薪資,以及班級的最高成績又或者是面試中都會遇到查找最大值的問題,是以本文我們就來列舉一下查詢數組中最大值的 5 種方法。
首先我們來看最原始也是最“笨”的實作方法:循環對比和遞歸對比。
方式一:循環對比
循環對比的執行流程如下圖所示:
從上圖可以看出,循環對比的核心是定義一個最大值,然後循環對比每一個元素,如果元素的值大于最大值就将最大值更新為此元素的值,再進行下一次比較,直到循環結束我們就能找到最大值了,實作代碼如下:
以上程式的執行結果為:
最大值是:7
方式二:遞歸對比
遞歸對比的核心是先定義兩個位置(起始位置和結束位置),每次對比開始位置和結束位置值的大小,當開始位置的值大于結束位置值時,将最大值設定為開始位置的值,然後将結束位置 -1(往前移動一位),繼續遞歸調用;相反,當結束位置的值大于開始位置時,将最大值設定為結束位置的值,将開始位置 +1(往後移動一位),繼續遞歸調用對比,直到遞歸結束就可以傳回最大值了,執行流程如下圖所示:
實作代碼如下:
以上程式的執行結果為:
最大值是:7
方式三:依賴 Arrays.sort() 實作
根據 Arrays.sort 方法可以将數組從小到大進行排序,排序完成之後,取最後一位的值就是最大值了,實作代碼如下:
以上程式的執行結果為:
最大值是:7
方式四:根據 Arrays.stream() 實作
stream
是 JDK 8 新增的核心功能之一,使用它我們可以很友善的實作很多功能,比如查找最大值、最小值等,實作代碼如下:
以上程式的執行結果為:
最大值是:7
方式五:依賴 Collections.max() 實作
使用 Collections 集合工具類也可以查找最大值和最小值,但在使用之前我們想要将數組(Array)轉換成集合(List),實作代碼如下:
以上程式的執行結果為:
最大值是:7
擴充知識:Arrays.sort 方法執行原理
為了搞明白 Arrays#sort 方法執行的原理,我們檢視了源碼發現
sort
方法的核心是通過循環進行排序的,源碼如下:
執行流程如下圖所示:
總結
本文介紹了 5 種查詢數組中最大值的方法,從大的次元可分為:手動實作和依賴接口實作。手動實作主要是通過循環和遞歸對比的方式,但這種方式并不推薦,因為它不夠優雅;依賴接口實作的方法有很多,其中主要推薦使用的是使用
stream
來實作查找最大值,因為它足夠簡單優雅。