在上面的類中,我們在構(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。為了測試排序功能,我們將寫一段測試代碼。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;
}
}
在上面的測試代碼中,我們創(chuàng)建一個 ArrayList 對象,并添加了 5 個字符串對象代表 5 個國家的名字。然后我們調(diào)用 getArrayList()、sortAscending()和 sortDescending()方法,并打印這些方法返回的 ArrayList 對象。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<>();
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);
}
}
在上面 JobCandidate 類被重寫的 compareTo()方法中,我們實現(xiàn)了基于年齡的比較邏輯。我見過很多程序員將(this.getAge() – candidate.getAge())作為返回的比較結(jié)果。盡管使用這種 return 語句看上去似乎很吸引人,并且也不會對我們的例子造成影響,我的建議是遠離這種語句。想象一下,比較整數(shù)值,其中有一個或者兩個都是負數(shù)的結(jié)果。這會導(dǎo)致一些錯誤,讓你的程序行為不定,而且更重要的是,這樣的錯誤是很細微的,尤其是在大型的企業(yè)應(yīng)用中很難檢測出來。下面我們將寫一個輔助類,為委托方對包含了 JobCandidate 元素的 ArrayList 對象進行排序。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;
}
}
在 JobCandidateSorter 類中,我們初始化了一個 ArrayList 對象,委托方將通過構(gòu)造函數(shù)實例化 JobCandidateSorter 。然后我們編寫了 getSortedJobCandidateByAge()方法,在這個方法中,我們調(diào)用 Collections.sort()并傳遞已經(jīng)初始化了的 ArrayList 為參數(shù),最后返回排序后的 ArrayList。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;
}
}
在上面的測試類中,我們創(chuàng)建了四個 JobCandidate 對象并把它們添加到 ArrayList,然后傳遞這個 ArrayList 到構(gòu)造函數(shù)來實例化 JobCandidateSorter 類。最后,我們調(diào)用 JobCandidateSorter 類的 getSortedJobCandidateByAge()方法,并打印這個方法返回的排序后的 ArrayList。測試的輸出結(jié)果如下: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<>();
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);
}
}
}
在上面的類中,從 29 行到 35 行,我們寫了一個匿名類并實現(xiàn)了 compare()方法,按照年齡的降序?qū)?JobCandidate 對象進行排序。從37行到42行,我們又寫了一個匿名類并實現(xiàn)了 compare() 方法,按照姓名的升序?qū)?JobCandidate進行排序。現(xiàn)在我們寫一個類,為委托方對 ArrayList 的元素進行排序。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;
}
}
在上面的類中,我們寫了 getSortedJobCandidateByAge()方法,在這個方法內(nèi)部我們調(diào)用了 Collections.sort()的重載版本,這個版本傳遞要被排序的 ArrayList 對象和比較年齡的 Comparator 對象。在 getSortedJobCandidateByName()方法內(nèi)部,我們又調(diào)用了 Collections.sort()的另一個重載版本,這個版本傳遞要被排序的 ArrayList 對象和比較姓名的 Comparator 對象。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;
}
}
在測試類中我們向 ArrayList 中添加若干 JobCandidate 對象,并使用 Before 注釋在測試單元的 setup()方法中創(chuàng)建了一個 JobCandidateSorter 對象。如果你是一個 Junit 新手,可以參考我以前的文章包括 Junit 注釋(Junit 單元測試系列)。在 testGetSortedJobCandidateByAge()測試方法中我們調(diào)用了 getSortedJobCandidateByAge()方法,并打印了該方法返回的排序后的 ArrayList。在 testGetSortedJobCandidateByName()測試方法中我們調(diào)用了getSortedJobCandidateByName()方法并同樣打印該方法返回的 ArrayList。測試的輸出如下: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<>();
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);
}
}
}
package com.yonyou.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
public static void main(String[] args) {
Student zlj = new Student("丁曉宇", 21);
Student dxy = new Student("趙四", 22);
Student cjc = new Student("張三", 11);
Student lgc = new Student("劉武", 19);
List<Student> studentList = new ArrayList<Student>();
studentList.add(zlj);
studentList.add(dxy);
studentList.add(cjc);
studentList.add(lgc);
System.out.println("按照年齡排序:");
Collections.sort(studentList, new SortByAge());
for (Student student : studentList) {
System.out.println(student.getName() + " / " + student.getAge());
}
System.out.println(" ========= ");
System.out.println("按照姓名排序");
Collections.sort(studentList, new SortByName());
for (Student student : studentList) {
System.out.println(student.getName() + " / " + student.getAge());
}
}
}
class SortByAge implements Comparator {
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
if (s1.getAge() > s2.getAge())
return 1;
else if (s1.getAge() == s2.getAge()) {
return 0;
}
return -1;
}
}
class SortByName implements Comparator {
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
if(s1.getName().compareTo(s2.getName()) < 0)
return -1;
else if (s1.getName().compareTo(s2.getName()) > 0) {
return 1;
}
return 0;
}
}
class Student{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(String name,int age) {
this.age = age;
this.name = name;
}
}
package com.lj.test;
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("hello");
arrayList.add("hello");
arrayList.add("hello");
arrayList.add("world");
arrayList.add("world");
arrayList.add("java");
ArrayList<String> arrayListnew = new ArrayList<>();
for(String s:arrayList){
if(!arrayListnew.contains(s)){
arrayListnew.add(s);
//便利舊集合沒有就添加到新集合
}
}
System.out.println("arraylistnew:" + arrayListnew);
}
}
簡單定義一個學(xué)生類,傳入名字及年齡即可。需要特別注意的是由于我們要比較學(xué)生對象里面的名字及年齡是否相等才能判斷該對象是否相等所以這里需要重寫學(xué)生類的equals()方法,有ecplise自動生成即可package com.lj.test;
public class Student {
private String studnet;
private int age;
public Student() {
super();
}
public Student(String studnet, int age) {
super();
this.studnet = studnet;
this.age = age;
}
public String getStudnet() {
return studnet;
}
public void setStudnet(String studnet) {
this.studnet = studnet;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [studnet=" + studnet + ", age=" + age + "]";
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (studnet == null) {
if (other.studnet != null)
return false;
} else if (!studnet.equals(other.studnet))
return false;
return true;
}
}
package com.lj.test;
import java.util.ArrayList;
public class ArrayListDemo2 {
public static void main(String[] args) {
ArrayList<Student> arrayList = new ArrayList<>();
ArrayList<Student> arrayListnew = new ArrayList<>();
Student s1 = new Student("pirlo",21);
Student s2 = new Student("pirlo",21);
Student s3 = new Student("范廚師",22);
Student s4 = new Student("馬師傅",21);
Student s5 = new Student("非洲德化",24);
Student s6 = new Student("pirlo",22);
arrayList.add(s1);
arrayList.add(s2);
arrayList.add(s3);
arrayList.add(s4);
arrayList.add(s5);
arrayList.add(s6);
for(Student s :arrayList){
System.out.println(s);
if(!arrayListnew.contains(s)){
arrayListnew.add(s);
}
}
System.out.println("---------------------");
for(Student s:arrayListnew){
System.out.println(s);
}
}
}
package com.lj.test;
import java.util.ArrayList;
import java.util.Collections;
public class ArrayListDemo3 {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("adobe");
arrayList.add("piack");
arrayList.add("錘子");
arrayList.add("手");
arrayList.add("下面是中文");
arrayList.add("我是中文");
arrayList.add("上面是中文加1");
arrayList.add("敖廠長");
arrayList.add("王尼瑪");
arrayList.add("back");
arrayList.add("aeobe");
Collections.sort(arrayList);
System.out.println(arrayList);
}
}
package com.lj.test;
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
super();
}
public Student(String studnet, int age) {
super();
this.name = studnet;
this.age = age;
}
public String getStudnet() {
return name;
}
public void setStudnet(String studnet) {
this.name = studnet;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [studnet=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Student o) {
int num = this.age - o.age;
int num2 = num == 0 ?this.name.compareTo(o.name):num;
return num2;
}
}
運行結(jié)果:package com.lj.test;
import java.util.ArrayList;
import java.util.Collections;
public class ArrayListDemo3 {
public static void main(String[] args) {
ArrayList<Student> arrayList = new ArrayList<Student>();
Student s1 = new Student("pirlo",21);
Student s3 = new Student("范廚師",23);
Student s4 = new Student("馬師傅",21);
Student s5 = new Student("非洲德化",24);
Student s6 = new Student("pirlo",22);
arrayList.add(s1);
arrayList.add(s3);
arrayList.add(s4);
arrayList.add(s5);
arrayList.add(s6);
Collections.sort(arrayList);
for(Student s : arrayList){
System.out.println(s);
}
}
}
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答?。?點擊進入論壇