国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java中怎么對 ArrayList排序

發(fā)布時(shí)間:2021-07-04 20:13 來(lái)源:億速云 閱讀:0 作者:Leah 欄目: 開(kāi)發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)Java中怎么對 ArrayList排序,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習,希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著(zhù)小編一起來(lái)看看吧。

排序字符串對象的 ArrayList

考慮一個(gè) ArrayList 存儲著(zhù)以字符串形式存在的國名(country name),為了對這個(gè) ArrayList  進(jìn)行排序,你需要調用 Collections.sort()方法,傳遞由國名構成的 ArrayList  對象。這種方法將按照自然順序(按字母升序)對元素(國名)進(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; } }

在上面的類(lèi)中,我們在構造器中初始化了一個(gè) ArrayList 對象。在 sortAscending()方法中,我們調用了  Collections.sort()方法,并傳遞這個(gè)初始化的 ArrayList對象為參數,返回排序后的 ArrayList。在  sortDescending()方法中,我們調用重載的 Collections.sort()方法讓其按照降序對元素排序,這個(gè)版本的  Collections.sort()接收ArrayList對象作為***個(gè)參數,一個(gè)由  Collections.reverseOrder()方法返回的 Comparator 對象作為第二個(gè)參數。我們將會(huì )在稍后講解  Comparator。為了測試排序功能,我們將寫(xiě)一段測試代碼。

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 href="http://www.jobbole.com/members/madao">@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); } }

在上面的測試代碼中,我們創(chuàng )建一個(gè) ArrayList 對象,并添加了 5 個(gè)字符串對象代表 5 個(gè)國家的名字。然后我們調用  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 元素都是非常簡(jiǎn)單的,我們僅僅只是調用 Collections.sort()方法并傳遞了需要排序的 ArrayList 對象作為參數。但是更多的是你會(huì )遇到一些復雜的情景下對 ArrayList 進(jìn)行排序。

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

使用Comparable排序ArrayList

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

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

  • 負值表示當前對象比傳遞給 comPareTO()的對象小

  • 零表示兩個(gè)對象相等

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

JobCandidate類(lèi)的代碼如下:

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 類(lèi)被重寫(xiě)的 compareTo()方法中,我們實(shí)現了基于年齡的比較邏輯。我見(jiàn)過(guò)很多程序員將(this.getAge()  &ndash; candidate.getAge())作為返回的比較結果。盡管使用這種 return  語(yǔ)句看上去似乎很吸引人,并且也不會(huì )對我們的例子造成影響,我的建議是遠離這種語(yǔ)句。想象一下,比較整數值,其中有一個(gè)或者兩個(gè)都是負數的結果。這會(huì )導致 一些錯誤,讓你的程序行為不定,而且更重要的是,這樣的錯誤是很細微的,尤其是在大型的企業(yè)應用中很難檢測出來(lái)。下面我們將寫(xiě)一個(gè)輔助類(lèi),為委托方對包含了 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 類(lèi)中,我們初始化了一個(gè) ArrayList 對象,委托方將通過(guò)構造函數實(shí)例化  JobCandidateSorter 。然后我們編寫(xiě)了 getSortedJobCandidateByAge()方法,在這個(gè)方法中,我們調用  Collections.sort()并傳遞已經(jīng)初始化了的 ArrayList 為參數,***返回排序后的 ArrayList。

接下來(lái),我們寫(xiě)一個(gè)測試類(lèi)來(lái)測試一下我們的代碼。

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 href="http://www.jobbole.com/members/madao">@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); } } }

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

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

使用 Comparator 排序 ArrayList

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

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

下面是使用了 Comparator 的 JobCandidate 類(lèi)代碼

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; } }

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

在上面的類(lèi)中,我們寫(xiě)了 getSortedJobCandidateByAge()方法,在這個(gè)方法內部我們調用了  Collections.sort()的重載版本,這個(gè)版本傳遞要被排序的 ArrayList 對象和比較年齡的 Comparator 對象。在  getSortedJobCandidateByName()方法內部,我們又調用了  Collections.sort()的另一個(gè)重載版本,這個(gè)版本傳遞要被排序的 ArrayList 對象和比較姓名的 Comparator 對象。

讓我們寫(xiě)一個(gè)測試類(lèi)來(lái)測試我們的代碼。

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 href="http://www.jobbole.com/members/madao">@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 href="http://www.jobbole.com/members/madao">@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); } } }

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

------------------------------------------------------- T E S T S ------------------------------------------------------- Running guru.springframework.blog.sortarraylist.comparator.JobCandidateSorterTest -----Sorted JobCandidate by name: Ascending----- Name: Andrew Styne, Gender: Male, age:24 Name: Betty Clark, Gender: Female, age:20 Name: Mark Smith, Gender: Male, age:26 Name: Sandy Hunt, Gender: Female, age:23 -----Sorted JobCandidate by age: Descending----- Name: Mark Smith, Gender: Male, age:26 Name: Andrew Styne, Gender: Male, age:24 Name: Sandy Hunt, Gender: Female, age:23 Name: Betty Clark, Gender: Female, age:20 Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.023 sec - in guru.springframework.blog.sortarraylist.comparator.JobCandidateSorterTest

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

avtt香蕉久久| 少妇人妻互换不带套| 免费视频无遮挡在线观看| 猫咪WWW免费人成网站| 国产精品熟女视频一区二区| 中文字幕久久久久人妻中出|