1. 程式人生 > >Java中ArrayList 元素的排序

Java中ArrayList 元素的排序

ArrayList 是一種 List 實現,它的內部用一個動態陣列來儲存元素,因此 ArrayList 能夠在新增和移除元素的時候進行動態的擴充套件和縮減。

<一> 排序字串的ArrayList

ArrayList中儲存的是String型別的資料,在對這個 ArrayList 進行排序,你需要呼叫 Collections.sort()方法,看一段示例程式碼:

package com.sort.pack;

import java.util.ArrayList;
import java.util.Collections;

public class SortArrayListAscDes
{
private ArrayList arrayList; public SortArrayListAscDes(ArrayList arrayList) { this.arrayList = arrayList; } public ArrayList getArrayList() { return arrayList; } public ArrayList sortAscending(){ //升序排序方法 Collections.sort(this.arrayList); return
this.arrayList; } public ArrayList sortDescending(){ //降序排序方法 Collections.sort(this.arrayList,Collections.reverseOrder()); return this.arrayList; } }

test類:

package com.sort.pack;

import java.util.ArrayList;

public class SortArrayListAscDecTest {
    public static void main(String[] args) {

        ArrayList stringArrayListist = new ArrayList<>();
stringArrayListist.add("Itlay"); stringArrayListist.add("China"); stringArrayListist.add("America"); stringArrayListist.add("Russian"); SortArrayListAscDes sortArrayListAscDes = new SortArrayListAscDes(stringArrayListist); System.out.println("沒有經過排序的陣列: "+stringArrayListist); System.out.println("升序排序: "+ sortArrayListAscDes.sortAscending()); System.out.println("降序排序: "+ sortArrayListAscDes.sortDescending()); } }
  • 在 sortDescending()方法中,我們呼叫過載的 Collections.sort()方法讓其按照降序對元素排序,這個版本的 Collections.sort()接收ArrayList物件作為第一個引數,一個由 Collections.reverseOrder()方法返回的 Comparator 物件作為第二個引數。
  • reverseOrder //逆序的意思

Collections.sort() 方法對 ArrayList 的元素或者任何其他 List 的實現提供的可比較的元素進行排序,這意味著這些元素的類需要實現 java.lang 包中的 Comparable 介面。正如 String 類實現了 Comparable 介面, Integer、Short、Double、Float、Boolean、BigInteger、BigDecimal、File 和 Date 類也都實現了 Comparable 介面.

<二>使用Comparable排序ArrayList

Comparable 是帶有單一 compareTo()方法的介面。一個實現了 Comparable 介面的類物件可以與其它同類型的物件進行比較,實現 Comparable 介面的類需要重寫 compareTo()方法,這個方法接收一個同類型的物件,並實現這個物件和傳遞給方法的另一個物件比較的邏輯。可以看一段示例程式碼:

package com.objectfile.writeread;
import java.io.Serializable;

public class Student implements Comparable<Student>,Serializable{
    private String name;
    private String number;
    private float score1;
    private float score2;
    private float score3;
    private float totlescore;

    public Student() {
    }

    public Student(String name, String number, float score1, float score2, float score3) {
        this.name = name;
        this.number = number;
        this.score1 = score1;
        this.score2 = score2;
        this.score3 = score3;
        this.totlescore = score1 + score2 + score3;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public float getScore1() {
        return score1;
    }

    public void setScore1(float score1) {
        this.score1 = score1;
    }

    public float getScore2() {
        return score2;
    }

    public void setScore2(float score2) {
        this.score2 = score2;
    }

    public float getScore3() {
        return score3;
    }

    public void setScore3(float score3) {
        this.score3 = score3;
    }

    public float getTotlescore() {
        return totlescore;
    }
    public void setTotlescore(float totlescore){
        this.totlescore = totlescore;
    }

    @Override
    public String toString() {
        return "name: "+this.getName()+" number: "+this.getNumber()+" score1: "+this.getScore1()+" score2: "+this.getScore2()+" score3: "+this.getScore3()+" totlescore:"+this.getTotlescore();
    }

  //按學生總分的降序排列
    @Override
    public int compareTo(Student o) {
        return (this.totlescore > o.totlescore ? -1 : (this.totlescore == o.totlescore ? 0 : 1));
    }
}
public class saveStudent {
    public List<Student> sortStudent(List<Student> sortlist){
        Collections.sort(sortlist);
        return sortlist;
    }
}

test類:

public class testObjectFile {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<Student>();
        for (int i = 1; i < 6; i++) {
            Scanner sc = new Scanner(System.in);
            System.out.println("請輸入第 "+i+" 個同學的姓名:");
            String name = sc.nextLine();
            System.out.println("請輸入你的學號:");
            String number = sc.nextLine();
            System.out.println("請輸入你的成績1:");
            float score1 = sc.nextFloat();
            System.out.println("請輸入你的成績2:");
            float score2 = sc.nextFloat();
            System.out.println("請輸入你的成績3:");
            float score3 = sc.nextFloat();
            Student stu = new Student(name,number,score1,score2,score3);
            list.add(stu);
        }

        saveStudent student = new saveStudent();
        list = student.sortStudent(list);  //先對所有的學生成績進行排名

這種方式你將只能基於一個成員變數(例如上面的例子就是基於學生資訊的總分)來物件的比較。

<三>使用 Comparator 排序 ArrayList

Comparator 介面與Comparable 介面相似也提供了一個單一的比較方法叫作 compare()。然而,與 Comparable的 compareTo()方法不同的是,這個 compare()接受兩個同類型的不同物件進行比較。

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;
     }
 }

一個匿名類並實現了 compare()方法,按照年齡的降序對 JobCandidate 物件進行排序。從37行到42行,我們又寫了一個匿名類並實現了 compare() 方法,按照姓名的升序對 JobCandidate進行排序。現在我們寫一個類,為委託方對 ArrayList 的元素進行排序。

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;
     }
 }

getSortedJobCandidateByAge()方法,在這個方法內部我們呼叫了 Collections.sort()的過載版本,這個版本傳遞要被排序的 ArrayList 物件和比較年齡的 Comparator 物件。在 getSortedJobCandidateByName()方法內部,我們又呼叫了 Collections.sort()的另一個過載版本,這個版本傳遞要被排序的 ArrayList 物件和比較姓名的 Comparator 物件。

相關推薦

JavaArrayList 元素排序

ArrayList 是一種 List 實現,它的內部用一個動態陣列來儲存元素,因此 ArrayList 能夠在新增和移除元素的時候進行動態的擴充套件和縮減。 <一> 排序字串的ArrayList ArrayList中儲存的是String型

JavaArrayList排序兩種方法以及遍歷的程式碼

方法一: 在類的定義中實現Comparable介面中的compareTo()方法,然後呼叫Collections.sort()進行排序: import java.util.Scanner

javaArrayList使用remove刪除元素時幾種常見的問題及解決辦法

一,for迴圈使用remove()刪除座標來刪除元素。 問題現象:迴圈的時候被刪除元素的下個元素不能讀取到。程式碼現象如下: List<String> testList1 = new ArrayList<Stri

javaArrayList和LinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

JavaArraylist源碼分析

如何 and 檢索 介紹 包括 com 這就是 pac 程序 前言:ArrayList作為我們常用的一個集合數據類型,我們在代碼中經常用它來裝載數據,可謂是和HashMap一樣常用的集合類型了。我們經常用它,那麽就有必須知道它的內部工作原理,比如它是如何添加進去數據的,它

javaCollections.sort排序詳解

比較器 元素 .net 字符 atp style pri com 實現接口 Comparator是個接口,可重寫compare()及equals()這兩個方法,用於比價功能;如果是null的話,就是使用元素的默認順序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f

Javaarraylist和linkedlist源代碼分析與性能比較

rom fin java 獲取 color () serializa padding previous Java中arraylist和linkedlist源代碼分析與性能比較 1,簡單介紹 在java開發中比較經常使用的數據結構是arra

JavaList集合排序的方法 比較器的使用 根據學生對象數序 語文 英語成績總和進行sort排序

private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti

JavaArrayList和LinkedList區別(轉)

java linked .com -s lan font array href spa 具體詳情參考原博客: http://pengcqu.iteye.com/blog/502676Java中ArrayList和LinkedList區別(轉)

Map四種獲取key和value值的方法,以及對map元素排序(轉)

compareto map.entry 排序 區別 sta hashmap 得到 package log 獲取map的值主要有四種方法,這四種方法又分為兩類,一類是調用map.keySet()方法來獲取key和value的值,另一類則是通過map.entrySet()方法來

【轉】java堆的排序

Java實現堆排序(大根堆)   堆排序是一種樹形選擇排序方法,它的特點是:在排序的過程中,將array[0,...,n-1]看成是一顆完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大(最小)的元素。 1. 若array[0,...,n

JAVA陣列氣泡排序和選擇排序

氣泡排序的思想:兩兩之間比較大小,小的數在前,大的數在後。共比較i-1次。 static void MaoPaoArray(int[] a) { for (int i = 0; i < a.length - 2; i++) { for (int j = 0; j <

Java常用的排序演算法(動態演示)

1.前言 這篇文章講解的是Java中或者面試中常用的**排序演算法**。 文章中例項  [linhaojian的Github](https://github.com/linhaojian 2.複雜度 相關概率

JavaPriorityQueue的排序

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/huanghanqian/article/details/73433760 PrioriryQueue是Queue介面的一個佇列實現類,但它的排序並不是典型的佇列式先進先出(F

Java的氣泡排序

import java.lang.reflect.Array; import java.util.Arrays; import java.util.Random; /**  * 生成一個[10,20]之間的隨機長度,裡面的元素是[10,50]之間的陣列  * 氣泡排序 &nb

資料結構----Java陣列的排序

快速排序:時間複雜度O(nlogn),不穩定的排序演算法 原理:快速排序是一種交換排序,它的基本思想是:通過一趟排序將待排序的記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,

Java陣列氣泡排序、選擇排序、二分查詢的詳細分析

前言:儘管在實際開發中,我們通過Arrays工具類就可以便利地對陣列進行排序和查詢的操作,但是掌握氣泡排序、選擇排序、二分法查詢的思想對於程式設計來說還是極其重要的,在很多場景都會用到。希望通過這篇部落格的分析能給大家帶來收穫。 主題:陣列的排序和查詢 1、冒泡法排序:

使用JavaArrayList實現鬥地主發牌

實現步驟: 1、造牌 A、首先造撲克花色 B、生成J、Q、K、A特殊牌 C、講花色和撲克進行拼接 2、建立三個玩家 3、洗牌 4、發牌 5、留三張底牌 public class Demo1Poker { public static void main(Str

javaArrayList 、LinkList區別

1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。     2.對於隨機訪問get和set,ArrayList優於LinkedList,因為ArrayList可以隨機定位,而LinkedList要移動指標一步一步的移動到節

JavaArrayList和LinkedList區別(常見面試題)

一般大家都知道ArrayList和LinkedList的大致區別:     1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。     2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為Lin