CodeGym /Blog Java /Ngẫu nhiên /Sắp xếp bộ sưu tập Java()

Sắp xếp bộ sưu tập Java()

Xuất bản trong nhóm
Một trong những chức năng phổ biến nhất mà chúng tôi cần khi các nhà phát triển xử lý dữ liệu là sắp xếp--bằng cách có thể sắp xếp dữ liệu của mình, chúng tôi có thể tối ưu hóa các thuật toán của mình để chạy nhanh hơn nhiều và tìm thấy dữ liệu cần thiết trong một khoảng thời gian mà nó sẽ mất để khác. Trong bài học hôm nay, chúng ta sẽ nói về Java Collections sort(). Như một thử nghiệm suy nghĩ nhanh: hãy tưởng tượng rằng bạn đang tìm kiếm một cái tên thông qua danh sách của một trường đại học. Có thể có hàng chục ngàn sinh viên tại trường này. Nếu danh sách bạn được cung cấp không theo thứ tự bảng chữ cái, bạn sẽ cần phải lật từng trang và xem xét thật cẩn thận để đảm bảo rằng bạn không bỏ qua một cái tên nào ở bất kỳ đâu, cho đến khi cuối cùng bạn tìm thấy cái tên mà mình đang tìm kiếm. Mặt khác, nếu danh sách được sắp xếp theo thứ tự bảng chữ cái, bạn không chỉ phải bớt khắt khe hơn trong việc tìm kiếm của mình, mà nhưng bạn có thể dễ dàng chuyển đến phần trong danh sách có cùng một chữ cái đầu tiên và tiếp tục nhảy qua các trang với tốc độ chóng mặt cho đến khi bạn gặp được người mà bạn đang tìm kiếm. Bạn càng làm việc với nhiều dữ liệu thì điều quan trọng là bạn phải sử dụng nó một cách hiệu quả và hiệu quả nhất có thể. Trong bài viết này, chúng ta sẽ tìm hiểu cách sắp xếp bất kỳ triển khai Danh sách nào trong Java (bao gồm cả ArrayList) bằng cách sử dụng phương thức sắp xếp Bộ sưu tập.

Cách sắp xếp ArrayList trong Java bằng phương pháp sắp xếp Bộ sưu tập Java

Hãy nói về phương thức Collections.sort của Java. Gói java.util chứa nhiều tiện ích và gói hữu ích thường được các nhà phát triển sử dụng, bao gồm cả ArrayList. Giả sử bạn có chương trình đơn giản sau:

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");
    }
}
Bạn muốn có thể in danh sách màu nhưng theo thứ tự bảng chữ cái. Làm thế nào bạn có thể làm điều này? Sử dụng java.util.Collections, việc sắp xếp dễ dàng như một lớp lót:

Collections.sort(colors);
Ta-da! Danh sách màu của bạn hiện đã được sắp xếp tại chỗ. Nếu bạn định in ra danh sách, như sau:

System.out.println(colors);
Sau đó, bạn sẽ nhận được đầu ra sau:

[Blue, Green, Orange, Red]
Làm thế nào là dễ dàng đó?! Sẽ thật dễ dàng khi sử dụng Collections.sort() để sắp xếp theo thứ tự tăng dần một danh sách Số nguyên, Số nổi hoặc bất kỳ loại dữ liệu đơn giản nào khác cho vấn đề đó. Nhưng nếu bạn muốn sắp xếp theo thứ tự giảm dần thì sao? Chắc chắn có những trường hợp điều này có ý nghĩa - hãy tưởng tượng rằng bạn có một danh sách điểm kiểm tra cho một lớp nhất định và bạn muốn tìm ra ai là học sinh đạt điểm cao nhất. Sẽ hợp lý hơn nhiều nếu sắp xếp danh sách theo thứ tự giảm dần (điểm cao nhất trước), sao cho câu trả lời bạn đang tìm nằm ngay trên đầu. Rất may, Collections.sort() được ghi đè bằng tham số thứ 2 tùy chọn, cho phép bạn thực hiện việc này:

sort(List l, Comparator c)
Nhưng so sánh là gì? Chà, một bộ so sánh chỉ đơn giản là một hàm so sánh hai đầu vào và trả về một số biểu thị đầu vào nào đến trước. Nếu bạn đang sắp xếp một ArrayList gồm các kiểu dữ liệu nguyên thủy, thì Bộ sưu tập Java đã cung cấp cho bạn một bộ so sánh ReverseOrder(). Nó có thể được gọi như thế này:

Collections.sort(colors, Collections.reverseOrder());
Bây giờ, màu sắc đã được sắp xếp ngược lại tại chỗ để nếu bạn in nó ra, bạn sẽ nhận được kết quả như sau:

[Red, Orange, Green, Blue]

Cách sử dụng Bộ sưu tập để sắp xếp các loại dữ liệu không nguyên thủy trong Java

Cho đến giờ, bạn đã thấy rằng việc sắp xếp ArrayLists của các chuỗi hoặc số nguyên trong Java bằng cách sử dụng phương thức Collections.sort() cũng dễ dàng như một dòng mã. Nhưng thông thường, ArrayLists của bạn sẽ lưu trữ các kiểu dữ liệu không nguyên thủy. Khi bạn đang làm việc với dữ liệu có nhiều thuộc tính phức tạp hơn, bạn sẽ muốn viết các lớp để biểu diễn các đối tượng này và cách chúng sẽ được so sánh với nhau bằng cách sử dụng các thuộc tính của chúng. Để khám phá một ví dụ về điều này, chúng ta hãy xem lại ví dụ sắp xếp danh sách các màu, nhưng lần này, thay vì sắp xếp các Chuỗi, chúng ta sẽ sắp xếp các đối tượng Màu. Lớp Màu cơ bản của chúng ta có thể trông giống như thế này:

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;
	}
}
Để làm cho lớp Màu của chúng ta tương thích với Collections.sort(), để Bộ sưu tập có thể hiểu cách so sánh và sắp xếp các đối tượng Màu, chúng ta cần thực hiện hai sửa đổi nhỏ:
  1. biến Màu thành một đối tượng Có thể so sánh (thêm các triển khai <Đối tượng> Có thể so sánh)
  2. ghi đè phương thức so sánh trong lớp (ghi đè công khai so sánh int (Object o))
Với những sửa đổi này, lớp của chúng ta bây giờ trông như thế này:

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);
	}
}
Lưu ý rằng phương thức so sánh của Màu chỉ đơn giản gọi phương thức so sánh của Chuỗi; sắp xếp sẽ được thực hiện theo thứ tự bảng chữ cái. Ví dụ, nếu chúng ta muốn sắp xếp theo giá trị màu đỏ theo thứ tự tăng dần, chúng ta có thể thay thế câu lệnh return bằng return this.r - cr; (nếu chúng ta muốn sắp xếp theo giá trị màu xanh lá cây theo thứ tự giảm dần, nó sẽ là return cg - this.g;). Bây giờ, nếu chúng ta gọi

Collections.sort(colors);
trên ArrayList of Colors thay vì chỉ Chuỗi, nó sẽ hoạt động vì Bộ sưu tập hiểu cách so sánh các đối tượng Màu. Nếu bạn không muốn làm cho đối tượng của mình triển khai Comparable<Object>, bạn có thể viết một bộ so sánh cho lớp của mình và chuyển nó vào phương thức Collections.sort() 2 tham số. Một bộ so sánh sẽ ghi đè một phương thức so sánh int công khai (Đối tượng một, Đối tượng hai) và phương thức Collections.sort() sử dụng phương thức này để so sánh các đối tượng trong khi sắp xếp. Một ví dụ về bộ so sánh SortByName và SortByRed được triển khai bên dưới:

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;
	}
}
Với điều này, bây giờ bạn có thể gọi

Collections.sort(colors, new SortByName());
không có lớp Màu thực sự triển khai Có thể so sánh và nó vẫn hoạt động. Đôi khi, bạn sẽ thấy điều này được thực hiện trực tuyến, sử dụng các hàm lambda. Hàm lambda về cơ bản là một hàm không tên mà bạn có thể xác định trong dòng mã gọi nó. Chúng hữu ích khi bạn chỉ cần gọi một hàm cho một trường hợp cụ thể và không muốn xác định toàn bộ hàm riêng biệt ở nơi khác. Bộ so sánh SortByName có thể được xác định nội tuyến, sử dụng hàm lambda, như sau:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
Như bạn có thể đoán, (a, b) đại diện cho các tham số của hàm lambda (hai đối tượng được so sánh). Dấu -> biểu thị rằng phần tiếp theo là định nghĩa hàm lambda. Đó là về nó! Bây giờ bạn đã thấy các phương pháp phổ biến nhất để sắp xếp ArrayLists trong Java bằng cách sử dụng gói Bộ sưu tập.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION