欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java集合進行排序的方式總結(jié)

 更新時間:2021年08月12日 08:25:02   作者:jszja  
在本篇文章里小編給大家整理的是一篇關(guān)于java集合進行排序的兩種方式總結(jié),有興趣的朋友們可以學(xué)習(xí)參考下。

ava集合的工具類Collections中提供了兩種排序的方法,分別是:

  1. Collections.sort(List list)
  2. Collections.sort(List list,Comparator c)

第一種稱為自然排序,參與排序的對象需實現(xiàn)comparable接口,重寫其compareTo()方法,方法體中實現(xiàn)對象的比較大小規(guī)則,示例如下:

實體類:(基本屬性,getter/setter方法,有參無參構(gòu)造方法,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("不能轉(zhuǎn)換為Emp類型的對象...");
    }

}

第二種叫定制排序,或自定義排序,需編寫匿名內(nèi)部類,先new一個Comparator接口的比較器對象c,同時實現(xiàn)compare()其方法;
然后將比較器對象c傳給Collections.sort()方法的參數(shù)列表中,實現(xiàn)排序功能;

說明:第一種方法不夠靈活,實體類實現(xiàn)了comparable接口后,會增加耦合,如果在項目中不同的位置需要根據(jù)不同的屬性調(diào)用排序方法時,需要反復(fù)修改比較規(guī)則(按name還是按age),二者只能選擇其一,會起沖突.第二種就很好地解決了這個問題.在需要的地方,創(chuàng)建個內(nèi)部類的實例,重寫其比較方法即可.

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注解標(biāo)注的方法會在其它測試方法執(zhí)行之前先執(zhí)行,
    //且只執(zhí)行一次.@Before注解標(biāo)注的方法會在每個測試方法之前執(zhí)行;
    //此處初始化集合只需要一次,因此使用@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("不能轉(zhuǎn)換為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("不能轉(zhuǎn)換為Emp類型");
            }
        });
        System.out.println("使用Comparator比較器按name升序排序后:");
        for(Object o : list){
            System.out.println(o);
        }
    }

}

右鍵空白位置 —> Run As —> JUnit Test —>

運行結(jié)果如下:

排序前:
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]

內(nèi)容擴展:

使用重載的Collections.sort(List,Comparator)方法

方法一:自定義一個比較器然后傳入

Collections.sort(List,Comparator)中。

測試代碼:

自定義的比較器:
import java.util.Comparator;

public class MyComparator implements Comparator<Cell>{
	@Override
	public int compare(Cell o1, Cell o2) {
		return o1.getY()-o2.getY();//根據(jù)傳入的cell的y坐標(biāo)由小到大進行排序
	}
}
測試類:
 @Test
    public void testComparator() {
    	List<Cell> cells = new ArrayList<>();
    	cells.add(new Cell(2,3));
    	cells.add(new Cell(5,1));
    	cells.add(new Cell(3,2));
    	System.out.println(cells);//[Cell [x=2, y=3], Cell [x=5, y=1], Cell [x=3, y=2]]
    	MyComparator com = new MyComparator();
    	Collections.sort(cells,com);
    	System.out.println(cells);//根據(jù)自定義排序后的結(jié)果:[Cell [x=5, y=1], Cell [x=3, y=2], Cell [x=2, y=3]]
    } 

方法二:采用匿名內(nèi)部的形式(推薦做法)

 @Test
    public void testComparator() {
    	List<Cell> cells = new ArrayList<>();
    	cells.add(new Cell(2,3));
    	cells.add(new Cell(5,1));
    	cells.add(new Cell(3,2));
    	System.out.println(cells);//[Cell [x=2, y=3], Cell [x=5, y=1], Cell [x=3, y=2]]
    	Collections.sort(cells,new Comparator<Cell>(){//此處創(chuàng)建了一個匿名內(nèi)部類
		@Override
		public int compare(Cell o1,Cell o2){
			return o1.getY() - o2.getY();
		}

	});
    	System.out.println(cells);//[Cell [x=5, y=1], Cell [x=3, y=2], Cell [x=2, y=3]]
    } 

到此這篇關(guān)于java集合進行排序的方式總結(jié)的文章就介紹到這了,更多相關(guān)java集合進行排序的兩種方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼

    java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼

    這篇文章主要介紹了java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼,需要的朋友可以參考下
    2016-07-07
  • Java NIO工作原理的全面分析

    Java NIO工作原理的全面分析

    JDK 1.4 中引入的新輸入輸出 (NIO) 庫在標(biāo)準(zhǔn) Java 代碼中提供了高速的、面向塊的 I/O。本實用教程從高級概念到底層的編程細節(jié),非常詳細地介紹了 NIO 庫。您將學(xué)到諸如緩沖區(qū)和通道這樣的關(guān)鍵 I/O 元素的知識,并考察更新后的庫中的標(biāo)準(zhǔn) I/O 是如何工作的。您還將了解只能通過 NIO 來完成的工作,如異步 I/O 和直接緩沖區(qū)。
    2013-02-02
  • java中常見的中文亂碼總結(jié)

    java中常見的中文亂碼總結(jié)

    本文主要介紹了java中常見的中文亂碼以及解決方法,主要包括字節(jié)碼文件讀取時出現(xiàn)的亂碼問題,本文通過實例代碼給大家介紹的非常詳細,具有很好的參考價值,感興趣的朋友跟隨小編一起看看吧
    2017-03-03
  • java?web實現(xiàn)簡單登錄注冊功能全過程(eclipse,mysql)

    java?web實現(xiàn)簡單登錄注冊功能全過程(eclipse,mysql)

    前期我們學(xué)習(xí)了javaweb項目用JDBC連接數(shù)據(jù)庫,還有數(shù)據(jù)庫的建表功能,下面這篇文章主要給大家介紹了關(guān)于java?web實現(xiàn)簡單登錄注冊功能的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Java并發(fā)編程之LongAdder源碼解析

    Java并發(fā)編程之LongAdder源碼解析

    這篇文章主要為大家介紹了Java并發(fā)編程之LongAdder源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • JetBrains?發(fā)布下一代?IDE無比輕量幾秒就能啟動干活

    JetBrains?發(fā)布下一代?IDE無比輕量幾秒就能啟動干活

    雖然?JetBrains?公司說?Fleet?的定位和目標(biāo)并不是代替其他?IDE,但個人覺得,?如果?Fleet?火起來了,其他?IDE?就會黯然失色,特別是多語言開發(fā)者,誰愿意裝多個?IDE?呢?到時候,可能?JetBrains?以后的所有?IDE?要一統(tǒng)江湖了
    2021-12-12
  • Java 基于UDP協(xié)議實現(xiàn)消息發(fā)送

    Java 基于UDP協(xié)議實現(xiàn)消息發(fā)送

    這篇文章主要介紹了Java 基于UDP協(xié)議實現(xiàn)消息發(fā)送,幫助大家更好的理解和學(xué)習(xí)Java網(wǎng)絡(luò)編程,感興趣的朋友可以了解下
    2020-11-11
  • Java使用選擇排序法對數(shù)組排序?qū)崿F(xiàn)代碼

    Java使用選擇排序法對數(shù)組排序?qū)崿F(xiàn)代碼

    這篇文章主要介紹了Java使用選擇排序法對數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下
    2014-02-02
  • 詳解Spring配置及事務(wù)的使用

    詳解Spring配置及事務(wù)的使用

    這篇文章主要介紹了詳解Spring配置及事務(wù)的使用,文中附含詳細的示例代碼說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法示例

    java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法示例

    這篇文章主要介紹了java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法,涉及java針對字符串的遍歷、判斷、運算相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06

最新評論