好程式設計師Java培訓分享Java集合的兩種排序方法
好程式設計師Java 培訓分享 Java 集合的兩種排序方法 , Java 集合的工具類Collections 中提供了兩種排序的方法 , 分別是 :
1.Collections.sort(List list)
2.Collections.sort(List list,Comparator c)
第一種稱為自然排序, 參與排序的物件需實現 comparable 介面 , 重寫其 compareTo() 方法 , 方法體中實現物件的比較大小規則 , 示例如下 :
實體類:( 基本屬性 ,getter/setter 方法 , 有參無參構造方法 ,toString 方法 )
package test;
public class Emp implements Comparable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Emp() {
super();
}
public Emp(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Emp [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
if(o instanceof Emp){
Emp emp = (Emp) o;
// return this.age-emp.getAge();// 按照年齡升序排序
return this.name.compareTo(emp.getName());// 換姓名升序排序
}
throw new ClassCastException(" 不能轉換為 Emp 型別的物件 ...");
}
}
第二種叫定製排序, 或自定義排序 , 需編寫匿名內部類 , 先 new 一個 Comparator 介面的比較器物件 c, 同時實現 compare() 其方法 ;
然後將比較器物件c 傳給 Collections.sort() 方法的引數列表中 , 實現排序功能 ;
說明: 第一種方法不夠靈活 , 實體類實現了 comparable 介面後 , 會增加耦合 , 如果在專案中不同的位置需要根據不同的屬性呼叫排序方法時 , 需要反覆修改比較規則 ( 按 name 還是按 age), 二者只能選擇其一 , 會起衝突 . 第二種就很好地解決了這個問題 . 在需要的地方 , 建立個內部類的例項 , 重寫其比較方法即可 .
jUnit4 單元測試類程式碼如下 :
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestSort {
static List list = new ArrayList();
//@BeforeClass 註解標註的方法會在其它測試方法執行之前先執行 ,
// 且只執行一次 .@Before 註解標註的方法會在每個測試方法之前執行 ;
// 此處初始化集合只需要一次 , 因此使用 @BeforeClass.
@BeforeClass
public static void init(){
list.add(new Emp("tom",18));
list.add(new Emp("jack",20));
list.add(new Emp("rose",15));
list.add(new Emp("jerry",17));
System.out.println(" 排序前 :");
for(Object o : list){
System.out.println(o);
}
}
/** 按 age 升序排序 */
// @Test
// public void testSortAge(){
// Collections.sort(list);
// System.out.println(" 自然排序按 age 排序後 :");
// for(Object o : list){
// System.out.println(o);
// }
// }
//
/** 按 name 升序排序 */
@Test
public void testSortName(){
Collections.sort(list);
System.out.println(" 自然排序按 name 升序排序後 :");
for(Object o : list){
System.out.println(o);
}
}
/** 使用 Comparator 比較器按 age 升序排序 */
@Test
public void testComparatorSortAge(){
Collections.sort(list,new Comparator () {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Emp && o2 instanceof Emp){
Emp e1 = (Emp) o1;
Emp e2 = (Emp) o2;
return e1.getAge() - e2.getAge();
}
throw new ClassCastException(" 不能轉換為 Emp 型別 ");
}
});
System.out.println(" 使用 Comparator 比較器按 age 升序排序後 :");
for(Object o : list){
System.out.println(o);
}
}
/** 使用 Comparator 比較器按 name 升序排序 */
@Test
public void testComparatorSortName(){
Collections.sort(list,new Comparator () {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Emp && o2 instanceof Emp){
Emp e1 = (Emp) o1;
Emp e2 = (Emp) o2;
return e1.getName().compareTo(e2.getName());
}
throw new ClassCastException(" 不能轉換為 Emp 型別 ");
}
});
System.out.println(" 使用 Comparator 比較器按 name 升序排序後 :");
for(Object o : list){
System.out.println(o);
}
}
}
右鍵空白位置— >Run As — >JUnit Test — >
執行結果如下:
排序前:
Emp [name=tom, age=18]
Emp [name=jack, age=20]
Emp [name=rose, age=15]
Emp [name=jerry, age=17]
自然排序按name 升序排序後 :
Emp [name=jack, age=20]
Emp [name=jerry, age=17]
Emp [name=rose, age=15]
Emp [name=tom, age=18]
使用Comparator 比較器按 age 升序排序後 :
Emp [name=rose, age=15]
Emp [name=jerry, age=17]
Emp [name=tom, age=18]
Emp [name=jack, age=20]
使用Comparator 比較器按 name 升序排序後 :
Emp [name=jack, age=20]
Emp [name=jerry, age=17]
Emp [name=rose, age=15]
Emp [name=tom, age=18]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2725878/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java培訓分享Java面試題集合篇一程式設計師Java面試題
- 好程式設計師Java培訓分享Java面試題集合篇二程式設計師Java面試題
- 好程式設計師Java培訓分享Mybatis面試題集合程式設計師JavaMyBatis面試題
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Java培訓分享Java面試題之Java集合篇三程式設計師Java面試題
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java培訓分享SpringBoot -YAML程式設計師JavaSpring BootYAML
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享Java常見排序演算法之插入排序程式設計師Java排序演算法
- 好程式設計師Java培訓分享Java EE與Java的區別程式設計師Java
- 好程式設計師Java培訓分享如何快速入門Java程式設計程式設計師Java
- 好程式設計師Java培訓分享Java和HTML的區別?程式設計師JavaHTML
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java培訓分享如何快速入門Java程式設計師Java
- 好程式設計師Java培訓分享Java包是什麼?程式設計師Java
- 好程式設計師Java培訓分享Java多執行緒程式設計師Java執行緒
- 好程式設計師Java培訓分享Spring Ioc的原理程式設計師JavaSpring
- 好程式設計師Java培訓分享maven-概述程式設計師JavaMaven
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- 好程式設計師Java培訓分享面試Java的注意事項程式設計師Java面試
- 好程式設計師Java培訓分享Java物件導向概念解析程式設計師Java物件
- 好程式設計師Java培訓分享Java初學者必讀程式設計師Java
- 好程式設計師Java培訓分享SpringBoot -啟動流程程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享For迴圈詳解程式設計師Java
- 好程式設計師Java培訓分享SpringBoot入門篇程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享本地快取如何設計程式設計師Java快取
- 好程式設計師Java培訓分享Java類載入的過程概述程式設計師Java
- 好程式設計師Java培訓分享Java的三大框架怎麼學?程式設計師Java框架
- 好程式設計師Java培訓分享學習Java需要哪些基礎程式設計師Java
- 好程式設計師Java培訓分享Java中級面試題合集程式設計師Java面試題
- 好程式設計師Java培訓分享Java讀寫Properties配置檔案程式設計師Java
- 好程式設計師Java培訓分享學Java需要什麼基礎?程式設計師Java
- 好程式設計師Java培訓分享Java基礎知識總結程式設計師Java
- 好程式設計師Java培訓分享Java效能常見命令有哪些程式設計師Java
- 好程式設計師Java培訓分享Java多執行緒併發程式設計師Java執行緒
- 好程式設計師Java培訓分享面試Java要注意什麼程式設計師Java面試