Java ArrayList 的不同排序方法Word格式.docx
《Java ArrayList 的不同排序方法Word格式.docx》由会员分享,可在线阅读,更多相关《Java ArrayList 的不同排序方法Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
returnthis.arrayList;
publicArrayListsortAscending(){
Collections.sort(this.arrayList);
publicArrayListsortDescending(){
Collections.sort(this.arrayList,Collections.reverseOrder());
在上面的类中,我们在构造器中初始化了一个ArrayList对象。
在sortAscending()方法中,我们调用了Collections.sort()方法,并传递这个初始化的ArrayList对象为参数,返回排序后的ArrayList。
在sortDescending()方法中,我们调用重载的Collections.sort()方法让其按照降序对元素排序,这个版本的Collections.sort()接收ArrayList对象作为第一个参数,一个由Collections.reverseOrder()方法返回的Comparator对象作为第二个参数。
我们将会在稍后讲解Comparator。
为了测试排序功能,我们将写一段测试代码。
SortArrayListAscendingDescendingTest.java
importorg.junit.Test;
importstaticorg.junit.Assert.*;
publicclassSortArrayListAscendingDescendingTest{
<
ahref="
publicvoidtestSortAscendingDescending()throwsException{
ArrayListcountryList=newArrayList&
lt;
&
gt;
();
countryList.add("
France"
);
USA"
India"
Spain"
England"
SortArrayListAscendingDescendingsortArrayList=newSortArrayListAscendingDescending(countryList);
ArrayListunsortedArrayList=sortArrayList.getArrayList();
System.out.println("
UnsortedArrayList:
"
+unsortedArrayList);
ArrayListsortedArrayListAscending=sortArrayList.sortAscending();
SortedArrayListinAscendingOrder:
+sortedArrayListAscending);
ArrayListsortedArrayListDescending=sortArrayList.sortDescending();
SortedArrayListinDescendingOrder:
+sortedArrayListDescending);
在上面的测试代码中,我们创建一个ArrayList对象,并添加了5个字符串对象代表5个国家的名字。
然后我们调用getArrayList()、sortAscending()和sortDescending()方法,并打印这些方法返回的ArrayList对象。
输出如下:
-------------------------------------------------------
TESTS
Runningguru.springframework.blog.sortarraylist.ascendingdescending.SortArrayListAscendingDescendingTest
[France,USA,India,Spain,England]
[England,France,India,Spain,USA]
[USA,Spain,India,France,England]
Testsrun:
1,Failures:
0,Errors:
0,Skipped:
0,Timeelapsed:
0.001sec-inguru.springframework.blog.sortarraylis
到目前为止,所要排序的ArrayList元素都是非常简单的,我们仅仅只是调用Collections.sort()方法并传递了需要排序的ArrayList对象作为参数。
但是更多的是你会遇到一些复杂的情景下对ArrayList进行排序。
Collections.sort()方法对ArrayList的元素或者任何其他List的实现提供的可比较的元素进行排序,这意味着这些元素的类需要实现java.lang包中的Comparable接口。
正如String类实现了Comparable接口,我们就可以对由国名构成的ArrayList排序。
有些其他的标准Java类实现了Comparable接口,包括原始的包装类,例如Integer、Short、Double、Float、Boolean、BigInteger、BigDecimal、File和Date类都实现了Comparable接口。
使用Comparable排序ArrayList
Comparable是带有单一
compareTo()方法的接口。
一个实现了Comparable接口的类对象可以与其它同类型的对象进行比较,实现Comparable接口的类需要重写compareTo()方法,这个方法接收一个同类型的对象,并实现这个对象和传递给方法的另一个对象比较的逻辑。
compareTo()方法返回Int类型的比较结果,分别代表下面的含义:
∙正值表示当前对象比传递给comPareTO()的对象大
∙负值表示当前对象比传递给comPareTO()的对象小
∙零表示两个对象相等
让我们来举一个例子,JobCandidate类的对象保存在ArrayList中并准备对其进行排序。
JobCandidate类有三个成员变量:
字符串类型的姓名和性别、整型的年龄。
我们想要对保存在ArrayList中的JobCandidate对象按照年龄进行排序。
因此我们要让JobCandidate类实现Comparable接口并重写compareTo()方法。
JobCandidate类的代码如下:
JobCandidate.java
packageparable;
publicclassJobCandidateimplementsComparable{
privateStringname;
privateStringgender;
privateintage;
publicJobCandidate(Stringname,Stringgender,intage){
this.name=name;
this.gender=gender;
this.age=age;
publicStringgetName(){
returnname;
publicStringgetGender(){
returngender;
publicintgetAge(){
returnage;
@Override
publicintcompareTo(JobCandidatecandidate){
return(this.getAge()<
candidate.getAge()?
-1:
(this.getAge()==candidate.getAge()?
0:
1));
publicStringtoString(){
return"
Name:
+this.name+"
Gender:
+this.gender+"
age:
"
+this.age;
在上面JobCandidate类被重写的compareTo()方法中,我们实现了基于年龄的比较逻辑。
我见过很多程序员将(this.getAge()–candidate.getAge())作为返回的比较结果。
尽管使用这种return语句看上去似乎很吸引人,并且也不会对我们的例子造成影响,我的建议是远离这种语句。
想象一下,比较整数值,其中有一个或者两个都是负数的结果。
这会导致一些错误,让你的程序行为不定,而且更重要的是,这样的错误是很细微的,尤其是在大型的企业应用中很难检测出来。
下面我们将写一个辅助类,为委托方对包含了JobCandidate元素的ArrayList对象进行排序。
JobCandidateSorter.java
importjava.util.ArrayList;
publicclassJobCandidateSorter{
ArrayListjobCandidate=newArrayList<
>
publicJobCandidateSorter(ArrayListjobCandidate){
this.jobCandidate=jobCandidate;
publicArrayListgetSortedJobCandidateByAge(){
Collections.sort(jobCandidate);
returnjobCandidate;
在JobCandidateSorter类中,我们初始化了一个ArrayList对象,委托方将通过构造函数实例化JobCandidateSorter。
然后我们编写了getSortedJobCandidateByAge()方法,在这个方法中,我们调用Collections.sort()并传递已经初始化了的ArrayList为参数,最后返回排序后的ArrayList。
接下来,我们写一个测试类来测试一下我们的代码。
JobCandidateSorterTest.java
importjava.lang.reflect.Array;
publicclassJobCandidateSorterTest{
publicvoidtestGetSortedJobCandidateByAge()throwsException{
JobCandidatejobCandidate1=newJobCandidate("
MarkSmith"
"
Male"
26);
JobCandidatejobCandidate2=newJobCandidate("
SandyHunt"
Female"
23);
JobCandidatejobCandidate3=newJobCandidate("
BettyClark"
20);
JobCandidatejobCandidate4=newJobCandidate("
AndrewStyne"
24);
ArrayListjobCandidateList=newArrayList&
jobCandidateList.add(jobCandidate1);
jobCandidateList.add(jobCandidate2);
jobCandidateList.add(jobCandidate3);
jobCandidateList.add(jobCandidate4);
JobCandidateSorterjobCandidateSorter=newJobCandidateSorter(jobCandidateList);
ArrayListsortedJobCandidate=jobCandidateSorter.getSortedJobCandidateByAge();
-----SortedJobCandidatebyage:
Ascending-----"
for(JobCandidatejobCandidate:
sortedJobCandidate){
System.out.println(jobCandidate);
在上面的测试类中,我们创建了四个JobCandidate对象并把它们添加到ArrayList,然后传递这个ArrayList到构造函数来实例化JobCandidateSorter类。
最后,我们调用JobCandidateSorter类的getSortedJobCandidateByAge()方法,并打印这个方法返回的排序后的ArrayList。
测试的输出结果如下:
Runningparable.JobCandidateSorterTest
Ascending-----
Name:
BettyClark,Gender:
Female,age:
20
SandyHunt,Gender:
23
AndrewStyne,Gender:
Male,age:
24
MarkSmith,Gender:
26
0.003sec
-inparable.JobCandidateSorterTest
使用Comparable对ArrayList排序是一种常用的方法。
但是你必须知道有某些限制。
你想要排序的对象的类必须实现Comparable并覆写compareTo()方法。
这基本上意味着你将只能基于一个成员变量来比较对象(我们例子中的年龄字段)。
如果要求你按照姓名和年龄来对JobCandidate对象进行排序怎么办?
Comparable就不是解决的方法了。
另外,比较逻辑是需要进行比较的对象的类的一部分,它消除了比较逻辑可复用性的可能。
Java通过使用在java.util包下提供的Comparator接口解决了上述的比较需求。
使用Comparator排序ArrayList
Comparator接口与Comparable接口相似也提供了一个单一的比较方法叫作compare()。
然而,与Comparable的compareTo()方法不同的是,这个compare()接受两个同类型的不同对象进行比较。
我们将用Comparator对我们之前使用过的相同
JobCandidate类对象进行排序。
我们将通过实现Comparatoras匿名内部类,允许对JobCandidate对象按照年龄和姓名进行排序。
下面是使用了Comparator的JobCandidate类代码
packageparator;
importjava.util.Comparator;
publicclassJobCandidate{
publicstaticComparatorageComparator=newComparator(){
publicintcompare(JobCandidatejc1,JobCandidatejc2){
return(jc2.getAge()<
jc1.getAge()?
(jc2.getAge()==jc1.getAge()?
};
publicstaticComparatornameComparator=newComparator(){
return(int)(jc1.getName().compareTo(jc2.getName()));
在上面的类中,从29行到35行,我们写了一个匿名类并实现了compare()方法,按照年龄的降序对JobCandidate对象进行排序。
从37行到42行,我们又写了一个匿名类并实现了compare()方法,按照姓名的升序对JobCandidate进行排序。
现在我们写一个类,为委托方对ArrayList的元素进行排序。
ArrayListjobCandida