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 物件。
相關推薦
Java中ArrayList 元素的排序
ArrayList 是一種 List 實現,它的內部用一個動態陣列來儲存元素,因此 ArrayList 能夠在新增和移除元素的時候進行動態的擴充套件和縮減。 <一> 排序字串的ArrayList ArrayList中儲存的是String型
Java中ArrayList的排序兩種方法以及遍歷的程式碼
方法一: 在類的定義中實現Comparable介面中的compareTo()方法,然後呼叫Collections.sort()進行排序: import java.util.Scanner
java中ArrayList使用remove刪除元素時幾種常見的問題及解決辦法
一,for迴圈使用remove()刪除座標來刪除元素。 問題現象:迴圈的時候被刪除元素的下個元素不能讀取到。程式碼現象如下: List<String> testList1 = new ArrayList<Stri
java中ArrayList和LinkedList區別
插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:
Java中Arraylist源碼分析
如何 and 檢索 介紹 包括 com 這就是 pac 程序 前言:ArrayList作為我們常用的一個集合數據類型,我們在代碼中經常用它來裝載數據,可謂是和HashMap一樣常用的集合類型了。我們經常用它,那麽就有必須知道它的內部工作原理,比如它是如何添加進去數據的,它
java中Collections.sort排序詳解
比較器 元素 .net 字符 atp style pri com 實現接口 Comparator是個接口,可重寫compare()及equals()這兩個方法,用於比價功能;如果是null的話,就是使用元素的默認順序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f
Java中arraylist和linkedlist源代碼分析與性能比較
rom fin java 獲取 color () serializa padding previous Java中arraylist和linkedlist源代碼分析與性能比較 1,簡單介紹 在java開發中比較經常使用的數據結構是arra
Java中List集合排序的方法 比較器的使用 根據學生對象數序 語文 英語成績總和進行sort排序
private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti
Java中ArrayList和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.複雜度 相關概率
Java中PriorityQueue的排序
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 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、冒泡法排序:
使用Java中ArrayList實現鬥地主發牌
實現步驟: 1、造牌 A、首先造撲克花色 B、生成J、Q、K、A特殊牌 C、講花色和撲克進行拼接 2、建立三個玩家 3、洗牌 4、發牌 5、留三張底牌 public class Demo1Poker { public static void main(Str
java中ArrayList 、LinkList區別
1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。 2.對於隨機訪問get和set,ArrayList優於LinkedList,因為ArrayList可以隨機定位,而LinkedList要移動指標一步一步的移動到節
Java中ArrayList和LinkedList區別(常見面試題)
一般大家都知道ArrayList和LinkedList的大致區別: 1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。 2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為Lin