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

Java ArrayList的不同排序方法

 更新時(shí)間:2015年12月14日 09:08:08   投稿:lijiao  
這篇文章主要介紹了Java ArrayList的不同排序方法,感興趣的小伙伴們可以參考一下

由于其功能性和靈活性,ArrayList是 Java 集合框架中使用最為普遍的集合類之一。ArrayList 是一種 List 實(shí)現(xiàn),它的內(nèi)部用一個(gè)動(dòng)態(tài)數(shù)組來(lái)存儲(chǔ)元素,因此 ArrayList 能夠在添加和移除元素的時(shí)候進(jìn)行動(dòng)態(tài)的擴(kuò)展和縮減。你可能已經(jīng)使用過(guò) ArrayList,因此我將略過(guò)基礎(chǔ)部分。如果你對(duì) ArrayList 還不熟悉,你可以參考它的 API 文檔,可以很容易理解在 ArrayList 上執(zhí)行基本的操作。
在這篇文章中,我將討論 ArrayList 中一種極其重要的操作,你很有可能需要在企業(yè)應(yīng)用開(kāi)發(fā)中實(shí)現(xiàn)它。它就是 ArrayList 元素的排序。

排序字符串對(duì)象的ArrayList

考慮一個(gè) ArrayList 存儲(chǔ)著以字符串形式存在的國(guó)名(country name),為了對(duì)這個(gè) ArrayList 進(jìn)行排序,你需要調(diào)用 Collections.sort()方法,傳遞由國(guó)名構(gòu)成的 ArrayList 對(duì)象。這種方法將按照自然順序(按字母升序)對(duì)元素(國(guó)名)進(jìn)行排序。讓我們?yōu)榇藖?lái)寫(xiě)一段代碼。
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;
 }
 }

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

package guru.springframework.blog.sortarraylist.ascendingdescending;
 import org.junit.Test;
 import java.util.ArrayList;
 import static org.junit.Assert.*;
 public class SortArrayListAscendingDescendingTest {
 <a >@Test</a>
 public void testSortAscendingDescending() throws Exception {
 ArrayList countryList = new ArrayList&lt;&gt;();
 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);
 }
 }

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

到目前為止,所要排序的 ArrayList 元素都是非常簡(jiǎn)單的,我們僅僅只是調(diào)用 Collections.sort()方法并傳遞了需要排序的 ArrayList 對(duì)象作為參數(shù)。但是更多的是你會(huì)遇到一些復(fù)雜的情景下對(duì) ArrayList 進(jìn)行排序。
Collections.sort() 方法對(duì) ArrayList 的元素或者任何其他 List 的實(shí)現(xiàn)提供的可比較的元素進(jìn)行排序,這意味著這些元素的類需要實(shí)現(xiàn) java.lang 包中的 Comparable 接口。正如 String 類實(shí)現(xiàn)了 Comparable 接口,我們就可以對(duì)由國(guó)名構(gòu)成的 ArrayList 排序。有些其他的標(biāo)準(zhǔn) Java 類實(shí)現(xiàn)了 Comparable 接口,包括原始的包裝類,例如 Integer、Short、Double、Float、Boolean、BigInteger、BigDecimal、File 和 Date 類都實(shí)現(xiàn)了 Comparable 接口。

使用Comparable排序ArrayList

Comparable 是帶有單一 compareTo()方法的接口。一個(gè)實(shí)現(xiàn)了 Comparable 接口的類對(duì)象可以與其它同類型的對(duì)象進(jìn)行比較,實(shí)現(xiàn) Comparable 接口的類需要重寫(xiě) compareTo()方法,這個(gè)方法接收一個(gè)同類型的對(duì)象,并實(shí)現(xiàn)這個(gè)對(duì)象和傳遞給方法的另一個(gè)對(duì)象比較的邏輯。compareTo()方法返回Int類型的比較結(jié)果,分別代表下面的含義:
正值表示當(dāng)前對(duì)象比傳遞給 comPareTO()的對(duì)象大
負(fù)值表示當(dāng)前對(duì)象比傳遞給 comPareTO()的對(duì)象小
零表示兩個(gè)對(duì)象相等
讓我們來(lái)舉一個(gè)例子,JobCandidate 類的對(duì)象保存在 ArrayList 中并準(zhǔn)備對(duì)其進(jìn)行排序。JobCandidate 類有三個(gè)成員變量:字符串類型的姓名和性別、整型的年齡。我們想要對(duì)保存在 ArrayList 中的 JobCandidate 對(duì)象按照年齡進(jìn)行排序。因此我們要讓 JobCandidate 類實(shí)現(xiàn) Comparable 接口并重寫(xiě) 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 類被重寫(xiě)的 compareTo()方法中,我們實(shí)現(xiàn)了基于年齡的比較邏輯。我見(jiàn)過(guò)很多程序員將(this.getAge() – candidate.getAge())作為返回的比較結(jié)果。盡管使用這種 return 語(yǔ)句看上去似乎很吸引人,并且也不會(huì)對(duì)我們的例子造成影響,我的建議是遠(yuǎn)離這種語(yǔ)句。想象一下,比較整數(shù)值,其中有一個(gè)或者兩個(gè)都是負(fù)數(shù)的結(jié)果。這會(huì)導(dǎo)致一些錯(cuò)誤,讓你的程序行為不定,而且更重要的是,這樣的錯(cuò)誤是很細(xì)微的,尤其是在大型的企業(yè)應(yīng)用中很難檢測(cè)出來(lái)。下面我們將寫(xiě)一個(gè)輔助類,為委托方對(duì)包含了 JobCandidate 元素的 ArrayList 對(duì)象進(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 類中,我們初始化了一個(gè) ArrayList 對(duì)象,委托方將通過(guò)構(gòu)造函數(shù)實(shí)例化 JobCandidateSorter 。然后我們編寫(xiě)了 getSortedJobCandidateByAge()方法,在這個(gè)方法中,我們調(diào)用 Collections.sort()并傳遞已經(jīng)初始化了的 ArrayList 為參數(shù),最后返回排序后的 ArrayList。
接下來(lái),我們寫(xiě)一個(gè)測(cè)試類來(lái)測(cè)試一下我們的代碼。
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 { <a >@Test</a> 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&lt;&gt;(); 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); } } }

在上面的測(cè)試類中,我們創(chuàng)建了四個(gè) JobCandidate 對(duì)象并把它們添加到 ArrayList,然后傳遞這個(gè) ArrayList 到構(gòu)造函數(shù)來(lái)實(shí)例化 JobCandidateSorter 類。最后,我們調(diào)用 JobCandidateSorter 類的 getSortedJobCandidateByAge()方法,并打印這個(gè)方法返回的排序后的 ArrayList。

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

使用 Comparator 排序 ArrayList

Comparator 接口與Comparable 接口相似也提供了一個(gè)單一的比較方法叫作 compare()。然而,與 Comparable的 compareTo()方法不同的是,這個(gè) compare()接受兩個(gè)同類型的不同對(duì)象進(jìn)行比較。
我們將用 Comparator 對(duì)我們之前使用過(guò)的相同 JobCandidate 類對(duì)象進(jìn)行排序。我們將通過(guò)實(shí)現(xiàn) Comparatoras 匿名內(nèi)部類,允許對(duì) JobCandidate 對(duì)象按照年齡和姓名進(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;
 }
 }

在上面的類中,從 29 行到 35 行,我們寫(xiě)了一個(gè)匿名類并實(shí)現(xiàn)了 compare()方法,按照年齡的降序?qū)?JobCandidate 對(duì)象進(jìn)行排序。從37行到42行,我們又寫(xiě)了一個(gè)匿名類并實(shí)現(xiàn)了 compare() 方法,按照姓名的升序?qū)?JobCandidate進(jìn)行排序?,F(xiàn)在我們寫(xiě)一個(gè)類,為委托方對(duì) 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;
 }
 }

在上面的類中,我們寫(xiě)了 getSortedJobCandidateByAge()方法,在這個(gè)方法內(nèi)部我們調(diào)用了 Collections.sort()的重載版本,這個(gè)版本傳遞要被排序的 ArrayList 對(duì)象和比較年齡的 Comparator 對(duì)象。在 getSortedJobCandidateByName()方法內(nèi)部,我們又調(diào)用了 Collections.sort()的另一個(gè)重載版本,這個(gè)版本傳遞要被排序的 ArrayList 對(duì)象和比較姓名的 Comparator 對(duì)象。
Let's write a test class to test our code.
讓我們寫(xiě)一個(gè)測(cè)試類來(lái)測(cè)試我們的代碼。
JobCandidateSorterTest.java

package guru.springframework.blog.sortarraylist.comparator;
 import guru.springframework.blog.sortarraylist.comparator.JobCandidate;
 import guru.springframework.blog.sortarraylist.comparator.JobCandidateSorter;
 import org.junit.Before;
 import org.junit.Test;
 import java.util.ArrayList;
 import static org.junit.Assert.*;
 public class JobCandidateSorterTest {
 JobCandidateSorter jobCandidateSorter;
 @Before
 public void setUp() 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&lt;&gt;();
 jobCandidateList.add(jobCandidate1);
 jobCandidateList.add(jobCandidate2);
 jobCandidateList.add(jobCandidate3);
 jobCandidateList.add(jobCandidate4);
 jobCandidateSorter = new JobCandidateSorter(jobCandidateList);
 }
 <a >@Test</a>
 public void testGetSortedJobCandidateByAge() throws Exception {
 System.out.println("-----Sorted JobCandidate by age: Descending-----");
ArrayList sortedJobCandidate = jobCandidateSorter.getSortedJobCandidateByAge();
 for (JobCandidate jobCandidate : sortedJobCandidate) {
 System.out.println(jobCandidate);
 }
 }
 <a >@Test</a>
 public void testGetSortedJobCandidateByName() throws Exception {
 System.out.println("-----Sorted JobCandidate by name: Ascending-----");
ArrayList sortedJobCandidate = jobCandidateSorter.getSortedJobCandidateByName();
 for (JobCandidate jobCandidate : sortedJobCandidate) {
 System.out.println(jobCandidate);
 }
 }
 }

在測(cè)試類中我們向 ArrayList 中添加若干 JobCandidate 對(duì)象,并使用 Before 注釋在測(cè)試單元的 setup()方法中創(chuàng)建了一個(gè) JobCandidateSorter 對(duì)象。如果你是一個(gè) Junit 新手,可以參考我以前的文章包括 Junit 注釋(Junit 單元測(cè)試系列)。在 testGetSortedJobCandidateByAge()測(cè)試方法中我們調(diào)用了 getSortedJobCandidateByAge()方法,并打印了該方法返回的排序后的 ArrayList。在 testGetSortedJobCandidateByName()測(cè)試方法中我們調(diào)用了getSortedJobCandidateByName()方法并同樣打印該方法返回的 ArrayList。

在本文中我們看到了 ArrayList 排序的不同方法。一種是使用 Comparable 另一種是使用 Comparator。方法的選擇一直是造成程序員們困惑的原因之一。你最應(yīng)該記住的就是一個(gè) Comparable 對(duì)象可以說(shuō)“我可以自己與另外一個(gè)對(duì)象比較”而一個(gè) Comparator 對(duì)象可以說(shuō)“我可以比較兩個(gè)不同的對(duì)象”。你不能說(shuō)一個(gè)接口比另一個(gè)要好。選擇的接口取決于你需要實(shí)現(xiàn)的功能。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 解決SpringMVC獲取請(qǐng)求參數(shù)亂碼問(wèn)題

    解決SpringMVC獲取請(qǐng)求參數(shù)亂碼問(wèn)題

    在使用SpringMVC和thymeleaf進(jìn)行請(qǐng)求參數(shù)處理時(shí),可能會(huì)遇到亂碼問(wèn)題,對(duì)于GET方法亂碼,可通過(guò)修改Tomcat的server.xml文件,添加URIEncoding="UTF-8"解決,而POST方法亂碼,則需在web.xml配置SpringMVC提供的過(guò)濾器
    2024-11-11
  • java獲取IP歸屬地全網(wǎng)顯示開(kāi)源庫(kù)使用

    java獲取IP歸屬地全網(wǎng)顯示開(kāi)源庫(kù)使用

    這篇文章主要為大家介紹了java獲取IP歸屬地全網(wǎng)顯示的開(kāi)源庫(kù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 淺談Java父子類加載順序

    淺談Java父子類加載順序

    本文主要介紹了Java父子類加載順序,那么這么長(zhǎng)怎么記呀?本文就幫大家總結(jié)一下,更有利于記憶,感興趣的可以了解一下
    2021-08-08
  • java中的類為什么只能用public修飾?

    java中的類為什么只能用public修飾?

    這篇文章主要介紹了java中的類為什么只能用public修飾,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Spring Boot 與 Kotlin 上傳文件的示例代碼

    Spring Boot 與 Kotlin 上傳文件的示例代碼

    這篇文章主要介紹了Spring Boot 與 Kotlin 上傳文件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • springboot簡(jiǎn)單集成Security配置的教程

    springboot簡(jiǎn)單集成Security配置的教程

    這篇文章主要介紹了springboot簡(jiǎn)單集成Security配置的教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 5分鐘搞懂java注解@Annotation的具體使用

    5分鐘搞懂java注解@Annotation的具體使用

    這篇文章主要介紹了5分鐘搞懂java注解@Annotation的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java替換字符串replace和replaceAll方法舉例詳解

    Java替換字符串replace和replaceAll方法舉例詳解

    這篇文章主要介紹了Java中替換字符串的幾種方法,包括String類的replace()、replaceAll()、replaceFirst()方法,以及StringBuilder和StringBuffer類的replace()方法,還提到了一些第三方庫(kù),如Hutool,它們提供了更豐富的字符串處理功能,需要的朋友可以參考下
    2025-02-02
  • Java?Zookeeper分布式分片算法超詳細(xì)講解流程

    Java?Zookeeper分布式分片算法超詳細(xì)講解流程

    ZooKeeper是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等
    2023-03-03
  • Spring Cloud服務(wù)安全連接方式

    Spring Cloud服務(wù)安全連接方式

    這篇文章主要介紹了Spring Cloud服務(wù)安全連接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

临夏市| 莎车县| 桐梓县| 蒲城县| 楚雄市| 依安县| 定陶县| 白银市| 桐乡市| 洛浦县| 吉隆县| 白水县| 浮梁县| 和林格尔县| 宁河县| 丹凤县| 衡东县| 连江县| 濉溪县| 陇南市| 东光县| 东海县| 湖北省| 饶阳县| 上蔡县| 桓仁| 邵阳市| 和硕县| 西盟| 铜鼓县| 乐清市| 都江堰市| 丹东市| 平顺县| 枣强县| 襄汾县| 墨玉县| 济源市| 赤城县| 北碚区| 杭锦后旗|