1、 return this.arrayList; public ArrayList sortAscending() Collections.sort(this.arrayList); public ArrayList sortDescending() Collections.sort(this.arrayList, Collections.reverseOrder();在上面的类中,我们在构造器中初始化了一个 ArrayList 对象。在 sortAscending()方法中,我们调用了 Collections.sort()方法,并传递这个初始化的 ArrayList对象为参数,返回排序后的 A
2、rrayList。在 sortDescending()方法中,我们调用重载的 Collections.sort()方法让其按照降序对元素排序,这个版本的 Collections.sort()接收ArrayList对象作为第一个参数,一个由 Collections.reverseOrder()方法返回的 Comparator 对象作为第二个参数。我们将会在稍后讲解 Comparator。为了测试排序功能,我们将写一段测试代码。SortArrayListAscendingDescendingTest.java import org.junit.Test; import static org.jun
3、it.Assert.*; public class SortArrayListAscendingDescendingTest a href= public void testSortAscendingDescending() throws Exception ArrayList countryList = new ArrayList<>(); countryList.add(France);USAIndiaSpainEngland SortArrayListAscendingDescending sortArrayList = new SortArrayListAscendingD
4、escending(countryList); ArrayList unsortedArrayList = sortArrayList.getArrayList(); System.out.println(Unsorted ArrayList: + unsortedArrayList); ArrayList sortedArrayListAscending = sortArrayList.sortAscending();Sorted ArrayList in Ascending Order : + sortedArrayListAscending); ArrayList sortedArray
5、ListDescending = sortArrayList.sortDescending();Sorted ArrayList in Descending Order: + sortedArrayListDescending);在上面的测试代码中,我们创建一个 ArrayList 对象,并添加了 5 个字符串对象代表 5 个国家的名字。然后我们调用 getArrayList()、sortAscending()和 sortDescending()方法,并打印这些方法返回的 ArrayList 对象。输出如下:- T E S T S Running guru.springframework.bl
6、og.sortarraylist.ascendingdescending.SortArrayListAscendingDescendingTest France, USA, India, Spain, England England, France, India, Spain, USA USA, Spain, India, France, England Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec - in guru.springframework.blog.sortarraylis到目前为
7、止,所要排序的 ArrayList 元素都是非常简单的,我们仅仅只是调用 Collections.sort()方法并传递了需要排序的 ArrayList 对象作为参数。但是更多的是你会遇到一些复杂的情景下对 ArrayList 进行排序。Collections.sort() 方法对 ArrayList 的元素或者任何其他 List 的实现提供的可比较的元素进行排序,这意味着这些元素的类需要实现 java.lang 包中的 Comparable 接口。正如 String 类实现了 Comparable 接口,我们就可以对由国名构成的 ArrayList 排序。有些其他的标准 Java 类实现了
8、Comparable 接口,包括原始的包装类,例如 Integer、Short、Double、Float、Boolean、BigInteger、BigDecimal、File 和 Date 类都实现了 Comparable 接口。使用Comparable排序ArrayListComparable 是带有单一compareTo()方法的接口。一个实现了 Comparable 接口的类对象可以与其它同类型的对象进行比较,实现 Comparable 接口的类需要重写 compareTo()方法,这个方法接收一个同类型的对象,并实现这个对象和传递给方法的另一个对象比较的逻辑。compareTo()方法
9、返回Int类型的比较结果,分别代表下面的含义: 正值表示当前对象比传递给 comPareTO()的对象大 负值表示当前对象比传递给 comPareTO()的对象小 零表示两个对象相等让我们来举一个例子,JobCandidate 类的对象保存在 ArrayList 中并准备对其进行排序。JobCandidate 类有三个成员变量:字符串类型的姓名和性别、整型的年龄。我们想要对保存在 ArrayList 中的 JobCandidate 对象按照年龄进行排序。因此我们要让 JobCandidate 类实现 Comparable 接口并重写 compareTo()方法。JobCandidate类的代码
10、如下:JobCandidate.javapackage parable; 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; publ
11、ic 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); public String toString() return Name: + this.name + , Gender: + this.gender + , age
12、: + this.age;在上面 JobCandidate 类被重写的 compareTo()方法中,我们实现了基于年龄的比较逻辑。我见过很多程序员将(this.getAge() candidate.getAge()作为返回的比较结果。尽管使用这种 return 语句看上去似乎很吸引人,并且也不会对我们的例子造成影响,我的建议是远离这种语句。想象一下,比较整数值,其中有一个或者两个都是负数的结果。这会导致一些错误,让你的程序行为不定,而且更重要的是,这样的错误是很细微的,尤其是在大型的企业应用中很难检测出来。下面我们将写一个辅助类,为委托方对包含了 JobCandidate 元素的 Array
13、List 对象进行排序。JobCandidateSorter.javaimport java.util.ArrayList; public class JobCandidateSorter ArrayList jobCandidate = new ArrayList public JobCandidateSorter(ArrayList jobCandidate) this.jobCandidate = jobCandidate; public ArrayList getSortedJobCandidateByAge() Collections.sort(jobCandidate); retu
14、rn jobCandidate;在 JobCandidateSorter 类中,我们初始化了一个 ArrayList 对象,委托方将通过构造函数实例化 JobCandidateSorter 。然后我们编写了 getSortedJobCandidateByAge()方法,在这个方法中,我们调用 Collections.sort()并传递已经初始化了的 ArrayList 为参数,最后返回排序后的 ArrayList。接下来,我们写一个测试类来测试一下我们的代码。JobCandidateSorterTest.java import java.lang.reflect.Array; public c
15、lass JobCandidateSorterTest public void testGetSortedJobCandidateByAge() throws Exception JobCandidate jobCandidate1 = new JobCandidate(Mark Smith, Male, 26); JobCandidate jobCandidate2 = new JobCandidate(Sandy HuntFemale, 23); JobCandidate jobCandidate3 = new JobCandidate(Betty Clark, 20); JobCandi
16、date jobCandidate4 = new JobCandidate(Andrew Styne, 24); ArrayList jobCandidateList = new ArrayList& jobCandidateList.add(jobCandidate1); jobCandidateList.add(jobCandidate2); jobCandidateList.add(jobCandidate3); jobCandidateList.add(jobCandidate4); JobCandidateSorter jobCandidateSorter = new JobCand
17、idateSorter(jobCandidateList); ArrayList sortedJobCandidate = jobCandidateSorter.getSortedJobCandidateByAge();-Sorted JobCandidate by age: Ascending-for (JobCandidate jobCandidate : sortedJobCandidate) System.out.println(jobCandidate);在上面的测试类中,我们创建了四个 JobCandidate 对象并把它们添加到 ArrayList,然后传递这个 ArrayLis
18、t 到构造函数来实例化 JobCandidateSorter 类。最后,我们调用 JobCandidateSorter 类的 getSortedJobCandidateByAge()方法,并打印这个方法返回的排序后的 ArrayList。测试的输出结果如下:Running parable.JobCandidateSorterTest Ascending- Name: Betty Clark, Gender: Female, age:20 Sandy Hunt, Gender:23 Andrew Styne, Gender: Male, age:24 Mark Smith, Gender:26
19、0.003 sec - in parable.JobCandidateSorterTest使用 Comparable 对 ArrayList 排序是一种常用的方法。但是你必须知道有某些限制。你想要排序的对象的类必须实现 Comparable 并覆写 compareTo()方法。这基本上意味着你将只能基于一个成员变量来比较对象(我们例子中的年龄字段)。如果要求你按照姓名和年龄来对 JobCandidate 对象进行排序怎么办? Comparable 就不是解决的方法了。另外,比较逻辑是需要进行比较的对象的类的一部分,它消除了比较逻辑可复用性的可能。Java 通过使用在 java.util 包下提
20、供的Comparator接口解决了上述的比较需求。使用 Comparator 排序 ArrayListComparator 接口与Comparable 接口相似也提供了一个单一的比较方法叫作 compare()。然而,与 Comparable的 compareTo()方法不同的是,这个 compare()接受两个同类型的不同对象进行比较。我们将用 Comparator 对我们之前使用过的相同JobCandidate 类对象进行排序。我们将通过实现 Comparatoras 匿名内部类,允许对 JobCandidate 对象按照年龄和姓名进行排序。下面是使用了 Comparator 的 JobC
21、andidate 类代码package parator; import java.util.Comparator; public class JobCandidate public static Comparator ageComparator = new Comparator() public int compare(JobCandidate jc1, JobCandidate jc2) return (jc2.getAge() jc1.getAge() ? (jc2.getAge() = jc1.getAge() ? ; public static Comparator nameComparator = new Comparator() return (int) (jc1.getName().compareTo(jc2.getName();在上面的类中,从 29 行到 35 行,我们写了一个匿名类并实现了 compare()方法,按照年龄的降序对 JobCandidate 对象进行排序。从37行到42行,我们又写了一个匿名类并实现了 compare() 方法,按照姓名的升序对 JobCandidate进行排序。现在我们写一个类,为委托方对 ArrayList 的元素进行排序。 ArrayList jobCandida
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1