大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) Java ArrayList排序方法詳解(一)

Java ArrayList排序方法詳解(一)

更新時間:2019-08-30 10:09:33 來源:動力節(jié)點 瀏覽2670次


今天動力節(jié)點java培訓(xùn)機構(gòu)為大家分享“Java ArrayList排序方法詳解”,希望通過這篇文章,大家能夠?qū)W會Java ArrayList排序方法,下面隨小編一起看看Java ArrayList排序方法詳解吧?


由于其功能性和靈活性,ArrayList是 Java 集合框架中使用最為普遍的集合類之一。ArrayList 是一種 List 實現(xiàn),它的內(nèi)部用一個動態(tài)數(shù)組來存儲元素,因此 ArrayList 能夠在添加和移除元素的時候進(jìn)行動態(tài)的擴展和縮減。你可能已經(jīng)使用過 ArrayList,因此我將略過基礎(chǔ)部分。如果你對 ArrayList 還不熟悉,你可以參考它的 API 文檔,可以很容易理解在 ArrayList 上執(zhí)行基本的操作。


  排序字符串對象的 ArrayList


  考慮一個 ArrayList 存儲著以字符串形式存在的國名(country name),為了對這個 ArrayList 進(jìn)行排序,你需要調(diào)用 Collections.sort()方法,傳遞由國名構(gòu)成的 ArrayList 對象。這種方法將按照自然順序(按字母升序)對元素(國名)進(jìn)行排序。讓我們?yōu)榇藖韺懸欢未a。


SortArrayListAscendingDescending.java


package guru.springframework.blog.sortarraylist.ascendingdescending;

 import java.util.ArrayList;

 import java.util.Collections;

 public class SortArrayListAscendingDescending {

 private ArrayList arrayList;

 public SortArrayListAscendingDescending(ArrayList arrayList) {

 this.arrayList = arrayList;

 }

 public ArrayList getArrayList() {

 return this.arrayList;

 }

 public ArrayList sortAscending() {

 Collections.sort(this.arrayList);

 return this.arrayList;

 }

 public ArrayList sortDescending() {

 Collections.sort(this.arrayList, Collections.reverseOrder());

 return this.arrayList;

 }

 }


在上面的類中,我們在構(gòu)造器中初始化了一個 ArrayList 對象。在 sortAscending()方法中,我們調(diào)用了 Collections.sort()方法,并傳遞這個初始化的 ArrayList對象為參數(shù),返回排序后的 ArrayList。在 sortDescending()方法中,我們調(diào)用重載的 Collections.sort()方法讓其按照降序?qū)υ嘏判颍@個版本的 Collections.sort()接收ArrayList對象作為第一個參數(shù),一個由 Collections.reverseOrder()方法返回的 Comparator 對象作為第二個參數(shù)。我們將會在稍后講解 Comparator。為了測試排序功能,我們將寫一段測試代碼。


SortArrayListAscendingDescendingTest.java


package guru.springframework.blog.sortarraylist.ascendingdescending;

 import org.junit.Test;

 import java.util.ArrayList;

 import static org.junit.Assert.*;

 public class SortArrayListAscendingDescendingTest {

 @Test

 public void testSortAscendingDescending() throws Exception {

 ArrayList countryList = new ArrayList<>();

 countryList.add("France");

 countryList.add("USA");

 countryList.add("India");

 countryList.add("Spain");

 countryList.add("England");

 SortArrayListAscendingDescending sortArrayList = new SortArrayListAscendingDescending(countryList);

 ArrayList unsortedArrayList = sortArrayList.getArrayList();

 System.out.println("Unsorted ArrayList: " + unsortedArrayList);

 ArrayList sortedArrayListAscending = sortArrayList.sortAscending();

 System.out.println("Sorted ArrayList in Ascending Order : " + sortedArrayListAscending);

 ArrayList sortedArrayListDescending = sortArrayList.sortDescending();

 System.out.println("Sorted ArrayList in Descending Order: " + sortedArrayListDescending);

 }

 }


在上面的測試代碼中,我們創(chuàng)建一個 ArrayList 對象,并添加了 5 個字符串對象代表 5 個國家的名字。然后我們調(diào)用 getArrayList()、sortAscending()和 sortDescending()方法,并打印這些方法返回的 ArrayList 對象。


  輸出如下:


------------------------------------------------------- 

T E S T S 

-------------------------------------------------------   

Running guru.springframework.blog.sortarraylist.ascendingdescending.SortArrayListAscendingDescendingTest   

Unsorted ArrayList: [France, USA, India, Spain, England] 

Sorted ArrayList in Ascending Order : [England, France, India, Spain, USA] 

Sorted ArrayList in Descending Order: [USA, Spain, India, France, England]   

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec - in guru.springframework.blog.sortarraylis

  

到目前為止,所要排序的 ArrayList 元素都是非常簡單的,我們僅僅只是調(diào)用 Collections.sort()方法并傳遞了需要排序的 ArrayList 對象作為參數(shù)。但是更多的是你會遇到一些復(fù)雜的情景下對 ArrayList 進(jìn)行排序。


  Collections.sort() 方法對 ArrayList 的元素或者任何其他 List 的實現(xiàn)提供的可比較的元素進(jìn)行排序,這意味著這些元素的類需要實現(xiàn) java.lang 包中的 Comparable 接口。正如 String 類實現(xiàn)了 Comparable 接口,我們就可以對由國名構(gòu)成的 ArrayList 排序。有些其他的標(biāo)準(zhǔn) Java 類實現(xiàn)了 Comparable 接口,包括原始的包裝類,例如 Integer、Short、Double、Float、Boolean、BigInteger、BigDecimal、File 和 Date 類都實現(xiàn)了 Comparable 接口。


  使用Comparable排序ArrayList


  Comparable 是帶有單一 compareTo()方法的接口。一個實現(xiàn)了 Comparable 接口的類對象可以與其它同類型的對象進(jìn)行比較,實現(xiàn) Comparable 接口的類需要重寫 compareTo()方法,這個方法接收一個同類型的對象,并實現(xiàn)這個對象和傳遞給方法的另一個對象比較的邏輯。compareTo()方法返回Int類型的比較結(jié)果,分別代表下面的含義:


  正值表示當(dāng)前對象比傳遞給 comPareTO()的對象大


  負(fù)值表示當(dāng)前對象比傳遞給 comPareTO()的對象小


  零表示兩個對象相等


  讓我們來舉一個例子,JobCandidate 類的對象保存在 ArrayList 中并準(zhǔn)備對其進(jìn)行排序。JobCandidate 類有三個成員變量:字符串類型的姓名和性別、整型的年齡。我們想要對保存在 ArrayList 中的 JobCandidate 對象按照年齡進(jìn)行排序。因此我們要讓 JobCandidate 類實現(xiàn) Comparable 接口并重寫 compareTo()方法。


  JobCandidate類的代碼如下:


JobCandidate.java


 package guru.springframework.blog.sortarraylist.comparable;

 public class JobCandidate implements Comparable {

 private String name;

 private String gender;

 private int age;

 public JobCandidate(String name, String gender, int age) {

 this.name = name;

 this.gender = gender;

 this.age = age;

 }

 public String getName() {

 return name;

 }

 public String getGender() {

 return gender;

 }

 public int getAge() {

 return age;

 }

 @Override

 public int compareTo(JobCandidate candidate) {

 return (this.getAge() < candidate.getAge() ? -1 :

 (this.getAge() == candidate.getAge() ? 0 : 1));

 }

 @Override

 public String toString() {

 return " Name: " + this.name + ", Gender: " + this.gender + ", age:" + this.age;

 }

 }


  在上面 JobCandidate 類被重寫的 compareTo()方法中,我們實現(xiàn)了基于年齡的比較邏輯。我見過很多程序員將(this.getAge() – candidate.getAge())作為返回的比較結(jié)果。盡管使用這種 return 語句看上去似乎很吸引人,并且也不會對我們的例子造成影響,我的建議是遠(yuǎn)離這種語句。想象一下,比較整數(shù)值,其中有一個或者兩個都是負(fù)數(shù)的結(jié)果。這會導(dǎo)致一些錯誤,讓你的程序行為不定,而且更重要的是,這樣的錯誤是很細(xì)微的,尤其是在大型的企業(yè)應(yīng)用中很難檢測出來。下面我們將寫一個輔助類,為委托方對包含了 JobCandidate 元素的 ArrayList 對象進(jìn)行排序。


  JobCandidateSorter.java


package guru.springframework.blog.sortarraylist.comparable;

import java.util.ArrayList;

 import java.util.Collections;

 public class JobCandidateSorter {

 ArrayList jobCandidate = new ArrayList<>();

 public JobCandidateSorter(ArrayList jobCandidate) {

 this.jobCandidate = jobCandidate;

 }

 public ArrayList getSortedJobCandidateByAge() {

 Collections.sort(jobCandidate);

 return jobCandidate;

 }

 }


在 JobCandidateSorter 類中,我們初始化了一個 ArrayList 對象,委托方將通過構(gòu)造函數(shù)實例化 JobCandidateSorter 。然后我們編寫了 getSortedJobCandidateByAge()方法,在這個方法中,我們調(diào)用 Collections.sort()并傳遞已經(jīng)初始化了的 ArrayList 為參數(shù),最后返回排序后的 ArrayList。


  接下來,我們寫一個測試類來測試一下我們的代碼。


  JobCandidateSorterTest.java


package guru.springframework.blog.sortarraylist.comparable;

 import org.junit.Test;

 import java.lang.reflect.Array;

 import java.util.ArrayList;

 import static org.junit.Assert.*;

 public class JobCandidateSorterTest {

 @Test

 public void testGetSortedJobCandidateByAge() throws Exception {

 JobCandidate jobCandidate1 = new JobCandidate("Mark Smith", "Male", 26);

 JobCandidate jobCandidate2 = new JobCandidate("Sandy Hunt", "Female", 23);

 JobCandidate jobCandidate3 = new JobCandidate("Betty Clark", "Female", 20);

 JobCandidate jobCandidate4 = new JobCandidate("Andrew Styne", "Male", 24);

 ArrayList jobCandidateList = new ArrayList<>();

 jobCandidateList.add(jobCandidate1);

 jobCandidateList.add(jobCandidate2);

 jobCandidateList.add(jobCandidate3);

 jobCandidateList.add(jobCandidate4);

 JobCandidateSorter jobCandidateSorter = new JobCandidateSorter(jobCandidateList);

 ArrayList sortedJobCandidate = jobCandidateSorter.getSortedJobCandidateByAge();

 System.out.println("-----Sorted JobCandidate by age: Ascending-----");

for (JobCandidate jobCandidate : sortedJobCandidate) {

 System.out.println(jobCandidate);

 }

 }

 }


  在上面的測試類中,我們創(chuàng)建了四個 JobCandidate 對象并把它們添加到 ArrayList,然后傳遞這個 ArrayList 到構(gòu)造函數(shù)來實例化 JobCandidateSorter 類。最后,我們調(diào)用 JobCandidateSorter 類的 getSortedJobCandidateByAge()方法,并打印這個方法返回的排序后的 ArrayList。測試的輸出結(jié)果如下:


T E S T S 

------------------------------------------------------- 

Running guru.springframework.blog.sortarraylist.comparable.JobCandidateSorterTest 

-----Sorted JobCandidate by age: Ascending----- 

Name: Betty Clark, Gender: Female, age:20

Name: Sandy Hunt, Gender: Female, age:23

Name: Andrew Styne, Gender: Male, age:24

Name: Mark Smith, Gender: Male, age:26

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec 

- in guru.springframework.blog.sortarraylist.comparable.JobCandidateSorterTest


  使用 Comparable 對 ArrayList 排序是一種常用的方法。但是你必須知道有某些限制。你想要排序的對象的類必須實現(xiàn) Comparable 并覆寫 compareTo()方法。這基本上意味著你將只能基于一個成員變量來比較對象(我們例子中的年齡字段)。如果要求你按照姓名和年齡來對 JobCandidate 對象進(jìn)行排序怎么辦? Comparable 就不是解決的方法了。另外,比較邏輯是需要進(jìn)行比較的對象的類的一部分,它消除了比較邏輯可復(fù)用性的可能。Java 通過使用在 java.util 包下提供的Comparator接口解決了上述的比較需求。


  使用 Comparator 排序 ArrayList


  Comparator 接口與Comparable 接口相似也提供了一個單一的比較方法叫作 compare()。然而,與 Comparable的 compareTo()方法不同的是,這個 compare()接受兩個同類型的不同對象進(jìn)行比較。


  我們將用 Comparator 對我們之前使用過的相同 JobCandidate 類對象進(jìn)行排序。我們將通過實現(xiàn) Comparatoras 匿名內(nèi)部類,允許對 JobCandidate 對象按照年齡和姓名進(jìn)行排序。


  下面是使用了 Comparator 的 JobCandidate 類代碼


  JobCandidate.java


package guru.springframework.blog.sortarraylist.comparator;

 import java.util.Comparator;

 public class JobCandidate {

 private String name;

 private String gender;

 private int age;

 public JobCandidate(String name, String gender, int age) {

 this.name = name;

 this.gender = gender;

 this.age = age;

 }

 public String getName() {

 return name;

 }

 public String getGender() {

 return gender;

 }

 public int getAge() {

 return age;

 }

 public static Comparator ageComparator = new Comparator() {

 @Override

 public int compare(JobCandidate jc1, JobCandidate jc2) {

 return (jc2.getAge() < jc1.getAge() ? -1 :

 (jc2.getAge() == jc1.getAge() ? 0 : 1));

 }

 };

 public static Comparator nameComparator = new Comparator() {

 @Override

 public int compare(JobCandidate jc1, JobCandidate jc2) {

 return (int) (jc1.getName().compareTo(jc2.getName()));

 }

 };

 @Override

 public String toString() {

 return " Name: " + this.name + ", Gender: " + this.gender + ", age:" + this.age;

 }

 }


  在上面的類中,我們寫了一個匿名類并實現(xiàn)了 compare()方法,按照年齡的降序?qū)?JobCandidate 對象進(jìn)行排序。我們又寫了一個匿名類并實現(xiàn)了 compare() 方法,按照姓名的升序?qū)? JobCandidate進(jìn)行排序?,F(xiàn)在我們寫一個類,為委托方對 ArrayList 的元素進(jìn)行排序。


  JobCandidateSorter.java


package guru.springframework.blog.sortarraylist.comparator;

 import java.util.ArrayList;

 import java.util.Collections;

 public class JobCandidateSorter {

 ArrayList jobCandidate = new ArrayList<>();

 public JobCandidateSorter(ArrayList jobCandidate) {

 this.jobCandidate = jobCandidate;

 }

 public ArrayList getSortedJobCandidateByAge() {

 Collections.sort(jobCandidate, JobCandidate.ageComparator);

 return jobCandidate;

 }

 public ArrayList getSortedJobCandidateByName() {

 Collections.sort(jobCandidate, JobCandidate.nameComparator);

 return jobCandidate;

 }

 }


由于內(nèi)容太多Java ArrayList排序方法詳解的內(nèi)容太多,本文已滿,請看下文:http://www.dabaquan.cn/javazixun/1683.html


相關(guān)免費視頻教程推薦


javase—— Arraylist視頻教程下載:http://www.dabaquan.cn/xiazai/2485.html



提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久精品亚洲精品国产色婷 | 四虎精品成人a在线观看 | 久久精品爱 | 久久久久久久国产精品视频 | 澳门久久精品 | 国产高清ujzzujzz | 精品精品国产理论在线观看 | 91精品啪在线观看国产色 | 99热这里只有精品69 | 国产18到20岁美女毛片 | 奇米影视基地 | 伊人久久综合网站 | 日本一级大黄毛片一级 | 日韩五月天 | 精品国产综合成人亚洲区 | www.欧美视频 | 思99热精品久久只有精品 | 国产成人免费观看在线视频 | 99亚洲| 久久亚洲国产精品一区二区 | 九九伦理影院手机观看 | 香蕉久久久久 | 福利午夜最新 | 性免费网站 | 四虎在线最新永久免费播放 | 精品一区二区三区三区 | chinese国产在线视频 | a在线观看 | 国产精品久久久久久影视 | 久久精品在这里 | 四虎永久地址4hu2019 | 五月国产综合视频在线观看 | 成人小视频免费观看 | 精品福利一区 | 欧美精品久久久久久久久大尺度 | 亚洲一区二区在线免费观看 | 欧美一级毛片免费观看 | 和日本免费不卡在线v | 中文字幕久久久久久久系列 | 亚洲爱婷婷色婷婷五月 | 日韩在线a视频免费播放 |