Java中ArrayList 元素的排序
ArrayList 是一種 List 實(shí)現(xiàn),它的內(nèi)部用一個(gè)動(dòng)態(tài)數(shù)組來存儲(chǔ)元素,因此 ArrayList 能夠在添加和移除元素的時(shí)候進(jìn)行動(dòng)態(tài)的擴(kuò)展和縮減。
<一> 排序字符串的ArrayList
ArrayList中存儲(chǔ)的是String類型的數(shù)據(jù),在對(duì)這個(gè) ArrayList 進(jìn)行排序,你需要調(diào)用 Collections.sort()方法,看一段示例代碼:
package com.sort.pack;import java.util.ArrayList; import java.util.Collections;public class SortArrayListAscDes {private ArrayList arrayList;public SortArrayListAscDes(ArrayList arrayList) {this.arrayList = arrayList;}public ArrayList getArrayList() {return arrayList;}public ArrayList sortAscending(){ //升序排序方法Collections.sort(this.arrayList);return this.arrayList;}public ArrayList sortDescending(){ //降序排序方法Collections.sort(this.arrayList,Collections.reverseOrder());return this.arrayList;} }test類:
package com.sort.pack;import java.util.ArrayList;public class SortArrayListAscDecTest {public static void main(String[] args) {ArrayList stringArrayListist = new ArrayList<>();stringArrayListist.add("Itlay");stringArrayListist.add("China");stringArrayListist.add("America");stringArrayListist.add("Russian");SortArrayListAscDes sortArrayListAscDes = new SortArrayListAscDes(stringArrayListist);System.out.println("沒有經(jīng)過排序的數(shù)組: "+stringArrayListist);System.out.println("升序排序: "+ sortArrayListAscDes.sortAscending());System.out.println("降序排序: "+ sortArrayListAscDes.sortDescending());} }- 在 sortDescending()方法中,我們調(diào)用重載的 Collections.sort()方法讓其按照降序?qū)υ嘏判?#xff0c;這個(gè)版本的 Collections.sort()接收ArrayList對(duì)象作為第一個(gè)參數(shù),一個(gè)由 Collections.reverseOrder()方法返回的 Comparator 對(duì)象作為第二個(gè)參數(shù)。
- reverseOrder //逆序的意思
Collections.sort() 方法對(duì) ArrayList 的元素或者任何其他 List 的實(shí)現(xiàn)提供的可比較的元素進(jìn)行排序,這意味著這些元素的類需要實(shí)現(xiàn) java.lang 包中的 Comparable 接口。正如 String 類實(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 接口的類需要重寫 compareTo()方法,這個(gè)方法接收一個(gè)同類型的對(duì)象,并實(shí)現(xiàn)這個(gè)對(duì)象和傳遞給方法的另一個(gè)對(duì)象比較的邏輯。可以看一段示例代碼:
package com.objectfile.writeread; import java.io.Serializable;public class Student implements Comparable<Student>,Serializable{private String name;private String number;private float score1;private float score2;private float score3;private float totlescore;public Student() {}public Student(String name, String number, float score1, float score2, float score3) {this.name = name;this.number = number;this.score1 = score1;this.score2 = score2;this.score3 = score3;this.totlescore = score1 + score2 + score3;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public float getScore1() {return score1;}public void setScore1(float score1) {this.score1 = score1;}public float getScore2() {return score2;}public void setScore2(float score2) {this.score2 = score2;}public float getScore3() {return score3;}public void setScore3(float score3) {this.score3 = score3;}public float getTotlescore() {return totlescore;}public void setTotlescore(float totlescore){this.totlescore = totlescore;}@Overridepublic String toString() {return "name: "+this.getName()+" number: "+this.getNumber()+" score1: "+this.getScore1()+" score2: "+this.getScore2()+" score3: "+this.getScore3()+" totlescore:"+this.getTotlescore();}//按學(xué)生總分的降序排列@Overridepublic int compareTo(Student o) {return (this.totlescore > o.totlescore ? -1 : (this.totlescore == o.totlescore ? 0 : 1));} } public class saveStudent {public List<Student> sortStudent(List<Student> sortlist){Collections.sort(sortlist);return sortlist;} }test類:
public class testObjectFile {public static void main(String[] args) {List<Student> list = new ArrayList<Student>();for (int i = 1; i < 6; i++) {Scanner sc = new Scanner(System.in);System.out.println("請(qǐng)輸入第 "+i+" 個(gè)同學(xué)的姓名:");String name = sc.nextLine();System.out.println("請(qǐng)輸入你的學(xué)號(hào):");String number = sc.nextLine();System.out.println("請(qǐng)輸入你的成績(jī)1:");float score1 = sc.nextFloat();System.out.println("請(qǐng)輸入你的成績(jī)2:");float score2 = sc.nextFloat();System.out.println("請(qǐng)輸入你的成績(jī)3:");float score3 = sc.nextFloat();Student stu = new Student(name,number,score1,score2,score3);list.add(stu);}saveStudent student = new saveStudent();list = student.sortStudent(list); //先對(duì)所有的學(xué)生成績(jī)進(jìn)行排名 }這種方式你將只能基于一個(gè)成員變量(例如上面的例子就是基于學(xué)生信息的總分)來對(duì)象的比較。
<三>使用 Comparator 排序 ArrayList
Comparator 接口與Comparable 接口相似也提供了一個(gè)單一的比較方法叫作 compare()。然而,與 Comparable的 compareTo()方法不同的是,這個(gè) compare()接受兩個(gè)同類型的不同對(duì)象進(jìn)行比較。
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;}//匿名內(nèi)部類public static Comparator ageComparator = new Comparator() {@Overridepublic int compare(JobCandidate jc1, JobCandidate jc2) {return (jc2.getAge() < jc1.getAge() ? -1 :(jc2.getAge() == jc1.getAge() ? 0 : 1));}};public static Comparator nameComparator = new Comparator() {@Overridepublic int compare(JobCandidate jc1, JobCandidate jc2) {return (int) (jc1.getName().compareTo(jc2.getName()));}};@Overridepublic String toString() {return " Name: " + this.name + ", Gender: " + this.gender + ", age:" + this.age;}}一個(gè)匿名類并實(shí)現(xiàn)了 compare()方法,按照年齡的降序?qū)?JobCandidate 對(duì)象進(jìn)行排序。從37行到42行,我們又寫了一個(gè)匿名類并實(shí)現(xiàn)了 compare() 方法,按照姓名的升序?qū)?JobCandidate進(jìn)行排序。現(xiàn)在我們寫一個(gè)類,為委托方對(duì) ArrayList 的元素進(jìn)行排序。
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;}}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ì)象。
總結(jié)
以上是生活随笔為你收集整理的Java中ArrayList 元素的排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 按生辰八字给宝宝取名的方法步骤
- 下一篇: 用omnipeek抓取配网组包