CodeGym /Java Blog /Toto sisi /Java 集合排序()
John Squirrels
等級 41
San Francisco

Java 集合排序()

在 Toto sisi 群組發布
作為處理數據的開發人員,我們需要的最常見功能之一是排序——通過能夠對數據進行排序,我們可以優化我們的算法以更快地運行,並在它需要的時間的一小部分內找到它需要的數據否則會採取。在今天的課程中,我們將討論 Java 集合 sort()。作為一個快速的思維實驗:假設您正在通過一所大學的花名冊搜索一個名字。這所學校可能有數万名學生。如果給你的花名冊不是按字母順序排列的,你需要翻閱每一頁並非常仔細地查看以確保你沒有在任何地方跳過一個名字,直到你最終找到你要找的名字。另一方面,如果花名冊是按字母順序排列的,你不僅可以不那麼嚴格地進行搜索,但是你可以很容易地跳到花名冊中首字母相同的部分,然後繼續大躍進地跳到頁面上,直到你找到你要找的人。您處理的數據越多,盡可能有效和高效地使用它就越重要。在本文中,我們將介紹如何使用 Collections 排序方法對 Java 中的任何 List 實現(包括 ArrayList)進行排序。

如何使用 Java 集合排序方法對 Java 中的 ArrayList 進行排序

讓我們談談 Java Collections.sort 方法。java.util 包包含許多有用的實用程序和包,開發人員經常使用這些實用程序和包,包括 ArrayList。假設您有以下簡單程序:

import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
您希望能夠打印出顏色列表,但要按字母順序排列。你會怎麼做?使用 java.util.Collections,排序就像一行代碼一樣簡單:

Collections.sort(colors);
噠噠!您的顏色列表現已就地排序。如果你要打印出列表,像這樣:

System.out.println(colors);
然後你會得到以下輸出:

[Blue, Green, Orange, Red]
談何容易?!使用 Collections.sort() 將整數、浮點數或與此相關的任何其他簡單數據類型的列表按升序排序同樣容易。但是如果你想按降序排序怎麼辦?在某些情況下,這肯定是有意義的——想像一下,你有一個特定班級的考試成績列表,你想找出誰是得分最高的學生。將列表按降序排序(最高分在前)會更有意義,這樣您要查找的答案就在頂部。值得慶幸的是,Collections.sort() 被可選的第二個參數覆蓋,它允許您這樣做:

sort(List l, Comparator c)
但什麼是比較器?好吧,比較器只是一個函數,它比較兩個輸入並返回一個數字,表示哪個輸入先出現。如果您正在對原始數據類型的 ArrayList 進行排序,那麼 Java Collections 已經為您提供了一個 reverseOrder() 比較器。可以這樣調用:

Collections.sort(colors, Collections.reverseOrder());
現在,顏色已就地反向排序,因此如果您將其打印出來,您將獲得以下輸出:

[Red, Orange, Green, Blue]

如何使用 Collections 對 Java 中的非原始數據類型進行排序

到目前為止,您已經看到在 Java 中使用Collections.sort()方法對字符串或整數的 ArrayList 進行排序就像一行代碼一樣簡單。但通常情況下,您的 ArrayList 將存儲非原始數據類型。當您處理具有更複雜屬性的數據時,您將希望編寫類來表示這些對像以及如何使用它們的屬性將它們相互比較。為了探索這方面的示例,讓我們重新審視對顏色列表進行排序的示例,但這一次,我們將對 Color 對象進行排序,而不是對字符串進行排序。我們的基本 Color 類可能看起來像這樣:

public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
為了使我們的 Color 類與 Collections.sort() 兼容,以便 Collections 能夠理解如何對 Color 對象進行比較和排序,我們需要進行兩個小修改:
  1. 使 Color 成為 Comparable 對象(添加實現 Comparable<Object>)
  2. 覆蓋類中的 compareTo 方法(覆蓋 public int compareTo(Object o))
通過這些修改,我們的類現在看起來像這樣:

public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
請注意,Color 的 compareTo 方法只是調用 String 的 compareTo 方法;排序將按字母順序進行。例如,如果我們想按紅色值升序排序,我們可以將 return 語句替換為 return this.r - cr; (如果我們想按綠色值降序排序,那就是 return cg - this.g;)。現在,如果我們調用

Collections.sort(colors);
在顏色的 ArrayList 而不僅僅是字符串上,它會起作用,因為 Collections 了解如何比較 Color 對象。如果您不想讓您的對象實現 Comparable<Object>,您也可以為您的類編寫一個比較器,並將其傳遞給 2 參數 Collections.sort() 方法。比較器覆蓋方法 public int compare(Object one, Object two),Collections.sort() 方法使用它在排序時比較對象。下面實現了 SortByName 和 SortByRed 比較器的示例:

class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
有了這個,你現在可以打電話

Collections.sort(colors, new SortByName());
如果沒有 Color 類實際實現 Comparable,它仍然可以工作。 有時,您會看到這是使用 lambda 函數在線完成的。lambda 函數本質上是一個無名函數,您可以在調用它的代碼行中定義它。當您只需要為一個特定實例調用一個函數而不想在別處定義一個完整的單獨函數時,它們很有用。SortByName 比較器可以使用 lambda 函數在線定義,如下所示:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
您可能已經猜到了,(a, b) 表示 lambda 函數的參數(要比較的兩個對象)。-> 表示後面是 lambda 函數定義。就是這樣!您現在已經了解了使用 Collections 包在 Java 中對 ArrayList 進行排序的最流行方法。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION