摘要:是用來對用戶自定義的對象數組排序功能的。官方文檔簡單描述了它的作用,但不足以讓我們深刻理解。比較器用于根據的比較其大小,并作為方法的參數。輸出總結總的來說,從中你應該了解到范型策略模式歸并排序時間復雜度類似于參考原文轉載自劉志軍
Arrays.sort(T[], Comparator < ? super T > c) 是用來對用戶自定義的對象數組排序功能的。Java 官方文檔簡單描述了它的作用,但不足以讓我們深刻理解。為了更深入地理解它,這篇文章將梳理相關的關鍵點。
1、簡單實例:如何使用Arrays.sort()通過閱讀下面代碼,你能快速正確了解這個方法的用途。Comparator(比較器)用于根據Dogs的size比較其大小,并作為sort方法的參數。
import java.util.Arrays; import java.util.Comparator; class Dog{ int size; public Dog(int s){ size = s; } } class DogSizeComparator implements Comparator{ @Override public int compare(Dog o1, Dog o2) { return o1.size - o2.size; } } public class ArraySort { public static void main(String[] args) { Dog d1 = new Dog(2); Dog d2 = new Dog(1); Dog d3 = new Dog(3); Dog[] dogArray = {d1, d2, d3}; printDogs(dogArray); Arrays.sort(dogArray, new DogSizeComparator()); printDogs(dogArray); } public static void printDogs(Dog[] dogs){ for(Dog d: dogs) System.out.print(d.size + " " ); System.out.println(); } }
輸出:
2 1 3 1 2 32、策略模式的使用
這是運用策略模式的一個很好的場景,為什么策略模式對于這種場景非常適用?簡單來說,策略模式使不同的算法在運行時得以選擇。在這個例子中,通過傳遞不同的Comparator,可以選擇不同的算法。基于上例,現在假設你有一個Comparator,用weight來代替size來比較Dogs。你可以簡單創建一個新的Comprator如下:
class Dog{ int size; int weight; public Dog(int s, int w){ size = s; weight = w; } } class DogSizeComparator implements Comparator{ @Override public int compare(Dog o1, Dog o2) { return o1.size - o2.size; } } class DogWeightComparator implements Comparator { @Override public int compare(Dog o1, Dog o2) { return o1.weight - o2.weight; } } public class ArraySort { public static void main(String[] args) { Dog d1 = new Dog(2, 50); Dog d2 = new Dog(1, 30); Dog d3 = new Dog(3, 40); Dog[] dogArray = {d1, d2, d3}; printDogs(dogArray); Arrays.sort(dogArray, new DogSizeComparator()); printDogs(dogArray); Arrays.sort(dogArray, new DogWeightComparator()); printDogs(dogArray); } public static void printDogs(Dog[] dogs){ for(Dog d: dogs) System.out.print("size="+d.size + " weight=" + d.weight + " "); System.out.println(); } }
輸出:
size=2 weight=50 size=1 weight=30 size=3 weight=40 size=1 weight=30 size=2 weight=50 size=3 weight=40 size=1 weight=30 size=3 weight=40 size=2 weight=50
Comparator僅僅是一個接口,任何實現了Comparator在運行時都可以被使用,這是策略模式的核心理念。
3、為什么使用“super”很顯然,如果”Comparator
import java.util.Arrays; import java.util.Comparator; class Animal{ int size; } class Dog extends Animal{ public Dog(int s){ size = s; } } class Cat extends Animal{ public Cat(int s){ size = s; } } class AnimalSizeComparator implements Comparator{ @Override public int compare(Animal o1, Animal o2) { return o1.size - o2.size; } //in this way, all sub classes of Animal can use this comparator. } public class ArraySort { public static void main(String[] args) { Dog d1 = new Dog(2); Dog d2 = new Dog(1); Dog d3 = new Dog(3); Dog[] dogArray = {d1, d2, d3}; printDogs(dogArray); Arrays.sort(dogArray, new AnimalSizeComparator()); printDogs(dogArray); System.out.println(); //when you have an array of Cat, same Comparator can be used. Cat c1 = new Cat(2); Cat c2 = new Cat(1); Cat c3 = new Cat(3); Cat[] catArray = {c1, c2, c3}; printDogs(catArray); Arrays.sort(catArray, new AnimalSizeComparator()); printDogs(catArray); } public static void printDogs(Animal[] animals){ for(Animal a: animals) System.out.print("size="+a.size + " "); System.out.println(); } }
輸出:
size=2 size=1 size=3 size=1 size=2 size=3 size=2 size=1 size=3 size=1 size=2 size=34、總結
總的來說,從Arrays.sort()中你應該了解到:
generic(范型)——super
策略模式
歸并排序——nlog(n)時間復雜度
java.util.Collections.sort(List
參考:Arrays.sort(T[], java.util.Comparator)
原文:Deep Understanding of Arrays.sort()
轉載自:ImportNew.com - 劉志軍
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69768.html
摘要:排序的算法是歸并排序。舉個例子,的算法可以不是使用歸并排序,但是該算法一定要是穩定的。這個類是的一部分。官方這個類只包含操作或返回集合的靜態方法。具體來說是,第一步,先把集合轉換為數組,第二步,調用。和沒有什么區別,只是傳參有點不同。 Arrays 1.作用看類的名字,就知道是對數組(數據類型[])進行各種操作。例如,排序、查找、復制等。 排序的算法是歸并排序。查找的算法是二分查找。復...
摘要:剛寫完這段代碼,就被開除了棧長前些天剛寫完上面這篇文章,沒幾天,又來一個悲劇。。。說到這個程序員,讓我想起了最近審查代碼時候的幾個坑,真是讓人哭笑不得。。。示例直接不行寫這么繞,還把邏輯寫錯了。 剛寫完這段代碼,就被開除了…… 棧長前些天剛寫完上面這篇文章,沒幾天,又來一個悲劇。。。 據說是一個月薪 9K 的 Java 程序員,因老板讓他寫一個排序算法,然后他就寫了一段屌炸天的休眠排序...
摘要:表達式還增強了集合庫。和前面的示例一樣先使用匿名內部類來排序然后再使用表達式精簡我們的代碼。使用舊的方式代碼如下所示使用匿名內部類根據排序使用可以通過下面的代碼實現同樣的功能使用排序也可以采用如下形式其他的排序如下所示。 本文轉自:http://blog.csdn.net/renfufei...轉載請注明出處 原文鏈接: Start Using Java Lambda Expressi...
摘要:單線程集合本部分將重點介紹非線程安全集合。非線程安全集合框架的最新成員是自起推出的。這是標準的單線程陣營中唯一的有序集合。該功能能有效防止運行時造型。檢查個集合之間不存在共同的元素。基于自然排序或找出集合中的最大或最小元素。 【編者按】本文作者為擁有十年金融軟件開發經驗的 Mikhail Vorontsov,文章主要概覽了所有標準 Java 集合類型。文章系國內 ITOM 管理平臺 O...
閱讀 1141·2021-11-23 10:04
閱讀 2401·2021-11-22 15:29
閱讀 2743·2021-11-19 09:40
閱讀 715·2021-09-22 15:26
閱讀 2117·2019-08-29 16:27
閱讀 2484·2019-08-29 16:10
閱讀 1918·2019-08-29 15:43
閱讀 3275·2019-08-29 12:43