Caác lệnh so sánh trong java năm 2024

CompareTo() trong Java là một phương thức quan trọng, được sử dụng để so sánh hai đối tượng của cùng một lớp. Trong bài viết này, hãy cùng Rikkei Academy tìm hiểu chi tiết về phương thức compareTo().

CompareTo trong Java là gì?

Phương thức compareTo() là một phương thức của lớp Object trong Java. Nó được định nghĩa để so sánh hai đối tượng với nhau bằng cách so sánh các thuộc tính của chúng, và trả về một số nguyên để biểu thị kết quả so sánh. Phương thức compareTo() được sử dụng phổ biến trong các đối tượng như Integer, Double, Long, Float,…

Tìm hiểu thêm về Cấu trúc dữ liệu

Cách hoạt động của compareto trong Java

Phương thức compareTo() trong Java được sử dụng để so sánh thứ tự của hai đối tượng với nhau.

Phương thức compareTo() trả về một số nguyên dương, số 0 hoặc số nguyên âm tùy thuộc vào mối quan hệ giữa hai đối tượng, trong đó:

  • Nếu đối tượng hiện tại lớn hơn đối tượng được truyền vào, phương thức compareTo() trả về một số nguyên dương
  • Nếu đối tượng hiện tại nhỏ hơn đối tượng được truyền vào, phương thức compareTo() trả về một số nguyên âm.
  • Nếu hai đối tượng bằng nhau, phương thức compareTo() trả về số 0.

Cách thức hoạt động của phương thức compareTo() phụ thuộc vào cách mà nó được triển khai trong từng lớp cụ thể. Tuy nhiên, phương thức compareTo() thường được triển khai bằng cách so sánh các thuộc tính của đối tượng để xác định thứ tự của chúng. Ví dụ, trong lớp String, phương thức compareTo() so sánh các ký tự của hai chuỗi để xác định thứ tự của chúng.

Các cách khai báo của phương thức compareTo trong Java

Trong Java, có hai phiên bản khác nhau của phương thức compareTo(), được định nghĩa trong hai giao diện khác nhau: Comparable và Comparator.

Phương thức compareTo() trong giao diện Comparable

Phương thức compareTo() trong giao diện Comparable được sử dụng để so sánh hai đối tượng của cùng một lớp hoặc lớp con của nó. Phương thức này được định nghĩa như sau:

public interface Comparable {

public int compareTo(T o);

}

Trong đó,T là kiểu đối tượng được so sánh và Tham số o là đối tượng được so sánh với đối tượng hiện tại. Phương thức compareTo() trả về một giá trị số nguyên, như sau:

  • Giá trị trả về là một số âm nếu đối tượng hiện tại nhỏ hơn đối tượng được so sánh.
  • Giá trị trả về là một số dương nếu đối tượng hiện tại lớn hơn đối tượng được so sánh.
  • Giá trị trả về là 0 nếu đối tượng hiện tại bằng với đối tượng được so sánh.

Lưu ý rằng đối tượng được so sánh phải là cùng kiểu hoặc là một lớp con của kiểu của đối tượng hiện tại. Nếu không, phương thức compareTo() sẽ gây ra lỗi ClassCastException.

import java.util.Arrays;

public class Person implements Comparable {

private String name;

private int age;

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

@Override

public int compareTo(Person other) {

// So sánh theo tuổi của hai đối tượng

return Integer.compare(this.age, other.age);

}

public static void main(String[] args) {

// Tạo các đối tượng Person

Person person1 = new Person(“Alice”, 25);

Person person2 = new Person(“Bob”, 30);

Person person3 = new Person(“Charlie”, 20);

// Sắp xếp danh sách các đối tượng Person theo tuổi

Person[] people = {person1, person2, person3};

Arrays.sort(people);

}

}

}

Phương thức compareTo() trong giao diện Comparator

Phương thức compareTo() trong giao diện Comparator được sử dụng để so sánh hai đối tượng không cùng lớp hoặc không có khả năng triển khai giao diện Comparable. Phương thức này được định nghĩa như sau:

public interface Comparator {

public int compare(T o1, T o2);

}

Trong đó, T là kiểu dữ liệu của hai đối tượng cần so sánh, o1 và o2 là hai đối tượng khác nhau cần so sánh. Phương thức compareTo() trả về một giá trị số nguyên, như sau:

  • Giá trị trả về là một số âm nếu o1 nhỏ hơn o2.
  • Giá trị trả về là một số dương nếu o1 lớn hơn o2.
  • Giá trị trả về là 0 nếu o1 bằng o2.

Phương thức compare() trong giao diện Comparator có thể được sử dụng để sắp xếp các đối tượng trong một danh sách hoặc một tập hợp theo một thứ tự nhất định.

import java.util.Comparator;

public class Student {

private String name;

private int age;

private double gpa;

public Student(String name, int age, double gpa) {

this.name = name;

this.age = age;

this.gpa = gpa;

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public double getGpa() {

return gpa;

}

public static void main(String[] args) {

// Tạo các đối tượng Student

Student student1 = new Student(“Alice”, 20, 3.5);

Student student2 = new Student(“Bob”, 22, 4.0);

Student student3 = new Student(“Charlie”, 19, 3.0);

// Sử dụng Comparator để sắp xếp danh sách các đối tượng Student theo tuổi

Comparator ageComparator = new Comparator() {

@Override

public int compare(Student student1, Student student2) {

return Integer.compare(student1.getAge(), student2.getAge());

}

};

// Sắp xếp danh sách các đối tượng Student theo tuổi bằng cách sử dụng phương thức sort() của lớp Arrays

Student[] students = {student1, student2, student3};

Arrays.sort(students, ageComparator);

}

}

}

Kết quả:

Charlie 19 3.0

Alice 20 3.5

Bob 22 4.0

Phương thức compareTo() trong lớp String

Các lớp khác như Integer, Double,… cũng có thể sử dụng phương thức compareTo() được định nghĩa trong interface Comparable và giao diện Comparator. Tuy nhiên, lớp String định nghĩa riêng phương thức compareTo() để sử dụng. Điều này là do cách thức so sánh chuỗi của lớp String khác với cách thức so sánh của các kiểu dữ liệu cơ bản khác. Vì vậy, lớp String định nghĩa riêng phương thức compareTo() để đảm bảo tính chính xác và nhất quán của các phép so sánh chuỗi.

Trong lớp java.lang.String, phương thức compareTo() được sử dụng để so sánh chuỗi hiện tại với một chuỗi khác và trả về một giá trị số nguyên để chỉ ra mối quan hệ giữa hai chuỗi đó trong thứ tự từ điển.

Cú pháp của phương thức compareTo() trong lớp String như sau:

public int compareTo(String anotherString)

Trong đó, anotherString là chuỗi khác mà chuỗi hiện tại cần so sánh. Phương thức compareTo() trả về một giá trị số nguyên, như sau:

  • Giá trị trả về là một số âm nếu chuỗi hiện tại nhỏ hơn chuỗi được so sánh.
  • Giá trị trả về là một số dương nếu chuỗi hiện tại lớn hơn chuỗi được so sánh.
  • Giá trị trả về là 0 nếu chuỗi hiện tại bằng với chuỗi được so sánh.

Phương thức compareTo() sử dụng thứ tự từ điển khi so sánh hai chuỗi. Điều này có nghĩa là các ký tự được sắp xếp theo thứ tự tăng dần trong bảng mã ASCII hoặc Unicode.

public class Main {

public static void main(String[] args) {

String str1 = “abc”;

String str2 = “def”;

int result = str1.compareTo(str2);

if (result < 0) {

System.out.println(“str1 is less than str2”);

} else if (result > 0) {

System.out.println(“str1 is greater than str2”);

} else {

System.out.println(“str1 is equal to str2”);

}

}

}

Kết quả của chương trình sẽ là “str1 is less than str2”, vì chuỗi “abc” nhỏ hơn chuỗi “def” theo thứ tự từ điển.

Ứng dụng phương thức compareTo()

Phương thức compareTo() được sử dụng trong nhiều trường hợp như:

Sắp xếp các đối tượng

Phương thức compareTo() được sử dụng để sắp xếp các đối tượng của một lớp. Ví dụ, trong các collection như ArrayList, LinkedList, TreeSet, TreeMap,… các đối tượng được sắp xếp dựa trên phương thức compareTo().

Dưới đây là một ví dụ ngắn và đơn giản về cách sử dụng phương thức compareTo() để sắp xếp các đối tượng Integer theo giá trị:

import java.util.Arrays;

public class SortIntegers {

public static void main(String[] args) {

// Tạo một mảng Integer

Integer[] numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

// Sắp xếp mảng Integer theo giá trị

Arrays.sort(numbers);

// In mảng Integer sau khi được sắp xếp

System.out.println(Arrays.toString(numbers));

}

}

Kết quả:

[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

Tìm kiếm các đối tượng

Phương thức compareTo() được sử dụng để tìm kiếm các đối tượng trong một danh sách được sắp xếp. Ví dụ, trong lớp binarySearch() trong lớp Arrays, phương thức compareTo() được sử dụng để tìm kiếm một đối tượng trong một mảng được sắp xếp.

import java.util.Arrays;

public class SearchBook {

public static void main(String[] args) {

// Tạo một mảng Book được sắp xếp theo tên sách

Book[] books = {new Book(“Java Programming”), new Book(“Python Programming”), new Book(“C++ Programming”)};

Arrays.sort(books);

// Tìm kiếm đối tượng Book có tên sách là “Java Programming”

Book searchBook = new Book(“Java Programming”);

int index = Arrays.binarySearch(books, searchBook);

// In kết quả tìm kiếm

if (index >= 0) {

System.out.println(“Found: ” + books[index].getTitle());

} else {

System.out.println(“Not found.”);

}

}

}

class Book implements Comparable {

private String title;

public Book(String title) {

this.title = title;

}

public String getTitle() {

return title;

}

@Override

public int compareTo(Book other) {

// So sánh hai đối tượng Book theo tên sách

return this.title.compareTo(other.title);

}

}

Kết quả:

Các phép so sánh khác

Phương thức compareTo() cũng có thể được sử dụng trong các phép so sánh khác. Ví dụ, trong lớp PriorityQueue, phương thức compareTo() được sử dụng để so sánh các phần tử để xác định thứ tự ưu tiên của chúng.

import java.util.PriorityQueue;

public class PriorityQueueExample {

public static void main(String[] args) {

// Tạo một PriorityQueue chứa các đối tượng Integer

PriorityQueue pq = new PriorityQueue<>();

// Thêm các phần tử vào hàng đợi ưu tiên

pq.add(10);

pq.add(5);

pq.add(15);

// In các phần tử của hàng đợi ưu tiên

while (!pq.isEmpty()) {

System.out.println(pq.poll());

}

}

}

Kết quả:

Các quy tắc quan trọng của compareTo() trong Java

Phương thức compareTo() phải tuân thủ các quy tắc sau:

Tính chuẩn xác

Phương thức compareTo() của một đối tượng a trong Java phải trả về 0 khi nó được so sánh với chính nó. Tức là, a.compareTo(a) phải luôn trả về giá trị 0.

Điều này có nghĩa là một đối tượng luôn bằng chính nó. Việc này là cần thiết để đảm bảo tính đối xứng và tính nhất quán trong việc so sánh các đối tượng. Nếu một đối tượng không bằng chính nó, việc sử dụng phương thức compareTo() để so sánh nó với chính nó có thể dẫn đến kết quả sai lệch.

Tính đối xứng

Điều này có nghĩa là nếu a.compareTo(b) trả về một số dương, thì b.compareTo(a) phải trả về một số âm. Nghĩa là khi so sánh hai đối tượng A và B bằng cách sử dụng phương thức compareTo() thì kết quả sẽ được đảo ngược nếu chúng ta so sánh hai đối tượng B và A. Nếu phương thức compareTo() không đảm bảo tính đối xứng, khi sử dụng nó để sắp xếp hoặc tìm kiếm, kết quả có thể không chính xác.

Tính bắc thang

Điều này có nghĩa là nếu a.compareTo(b) trả về một số dương và b.compareTo(c) trả về một số dương, thì a.compareTo(c) phải trả về một số dương. Tính bắc thang đảm bảo rằng khi chúng ta so sánh hai đối tượng A và B bằng cách sử dụng phương thức compareTo() thì kết quả sẽ là 0 nếu A và B có cùng giá trị, và kết quả sẽ không bằng 0 nếu A và B có giá trị khác nhau.

Tính nhất quán

Phương thức compareTo() phải đảm bảo tính nhất quán với phương thức equals(). Điều này có nghĩa là nếu a.equals(b) trả về true, thì a.compareTo(b) phải trả về 0. Nếu phương thức compareTo() không đảm bảo tính nhất quán với phương thức equals(), khi sử dụng nó trong một môi trường yêu cầu tính nhất quán, như trong các collection, kết quả có thể không chính xác.

Ví dụ:

public class Number implements Comparable {

private int value;

public Number(int value) {

this.value = value;

}

public int getValue() {

return value;

}

@Override

public int compareTo(Number other) {

// So sánh hai đối tượng Number theo giá trị

return this.value – other.getValue();

}

}

public class Main {

public static void main(String[] args) {

Number n1 = new Number(10);

Number n2 = new Number(20);

// Tính đối xứng

int result1 = n1.compareTo(n2);

System.out.println(result1); // Kết quả là -10

int result2 = n2.compareTo(n1);

System.out.println(result2); // Kết quả là 10

// Tính bắc thang

Number n3 = new Number(20);

int result3 = n2.compareTo(n3);

System.out.println(result3); // Kết quả là 0

// Tính nhất quán

Number n4 = new Number(10);

boolean equals1 = n1.equals(n4);

System.out.println(equals1); // Kết quả là true

int result4 = n1.compareTo(n4);

System.out.println(result4); // Kết quả là 0

}

}

Mối quan hệ giữa equal và compareto trong java

Trong Java, phương thức equals() và phương thức compareTo() là hai phương thức được sử dụng để so sánh hai đối tượng với nhau, nhưng có mục đích và cách thức hoạt động khác nhau.

  • Phương thức equals() được sử dụng để kiểm tra xem hai đối tượng có bằng nhau không. Nó trả về giá trị boolean và được định nghĩa trong lớp Object.
  • Phương thức compareTo() được sử dụng để so sánh thứ tự của hai đối tượng. Nó trả về giá trị số nguyên và được định nghĩa trong interface Comparable

Dưới đây là bảng so sánh giữa phương thức compareTo() và equals() trong Java:

Đặc điểm compareTo() equals() Mục đích So sánh thứ tự của hai đối tượng So sánh tính bằng nhau của hai đối tượng Kiểu trả về Số nguyên dương, số 0 hoặc số nguyên âm Boolean true hoặc false Tham số Một đối tượng để so sánh Một đối tượng để so sánh Sử dụng Trong các lớp có tính sắp xếp, chẳng hạn như Comparable Trong các lớp không có tính sắp xếp hoặc không cho phép sắp xếp, chẳng hạn như Object Ví dụ str1.compareTo(str2) sẽ trả về số âm vì “hello” đứng trước “world” trong thứ tự từ điển str1.equals(str2) sẽ trả về false vì “hello” và “world” khác nhau

Nhìn chung, các lớp có tính sắp xếp thường triển khai cả hai phương thức equals() và compareTo() để đảm bảo tính nhất quán trong việc so sánh đối tượng. Nếu phương thức equals() trả về true thì phương thức compareTo() cũng phải trả về số 0. Nếu hai đối tượng bằng nhau theo phương thức equals() thì chúng phải có cùng thứ tự khi sử dụng phương thức compareTo()

Lưu ý khi sử dụng phương thức compareTo()

  • Các giá trị trả về của phương thức compareTo() phải nằm trong một phạm vi cụ thể: Thông thường, phương thức compareTo() trả về một số nguyên âm, số nguyên dương hoặc 0. Nếu phương thức compareTo() trả về một giá trị nằm ngoài phạm vi này, khi sử dụng nó để sắp xếp hoặc tìm kiếm, kết quả có thể không chính xác.
  • Phương thức compareTo() chỉ dùng để so sánh hai đối tượng cùng kiểu: Phương thức compareTo() chỉ được sử dụng để so sánh hai đối tượng cùng kiểu. Nếu bạn muốn so sánh hai đối tượng khác kiểu, bạn phải sử dụng phương thức khác như equals().
  • Kiểm tra đối tượng đầu vào để tránh lỗi NullPointerException: Điều này đặc biệt quan trọng khi so sánh các đối tượng của kiểu dữ liệu phức tạp.
  • Sử dụng interface Comparator nếu không thể thay đổi lớp đang sử dụng: Nếu không thể thay đổi lớp đang sử dụng để triển khai interface Comparable, bạn có thể sử dụng một lớp khác để định nghĩa phương thức compareTo() thông qua interface Comparator.

Bài luyện tập với phương thức compareto

  1. Viết chương trình Java để so sánh hai số nguyên bằng phương thức compareTo(). Yêu cầu nhập vào hai số nguyên từ bàn phím và in ra kết quả so sánh.
  2. Viết chương trình Java để tìm chuỗi có độ dài lớn nhất trong một danh sách các chuỗi bằng phương thức compareTo(). Yêu cầu nhập vào một danh sách các chuỗi từ bàn phím và in ra chuỗi có độ dài lớn nhất.
  3. Viết chương trình Java để sắp xếp một danh sách các điểm số của các sinh viên bằng phương thức compareTo(). Yêu cầu nhập vào một danh sách các điểm số từ bàn phím và in ra danh sách sau khi được sắp xếp.
  4. Viết chương trình Java để tìm số lớn thứ hai trong một danh sách các số nguyên bằng phương thức compareTo(). Yêu cầu nhập vào một danh sách các số nguyên từ bàn phím và in ra số lớn thứ hai.

Kết luận

Trên đây là những thông tin quan trọng về phương thức compareTo() trong Java. Việc hiểu và sử dụng đúng phương thức này là rất quan trọng trong việc xây dựng các ứng dụng Java. Hy vọng qua bài viết này bạn đã giúp bạn hiểu hơn về phương thức này và đừng quên thực hành để nhuần nhuyễn kiến thức nhé!

Nếu bạn đang muốn tìm hiểu về khóa học lập trình, tham khảo ngay Rikkei Academy! Với lộ trình tinh gọn, bám sát thực tế cùng sự hỗ trợ sát sao 24/7 từ giảng viên sẽ giúp bạn chinh phục ngôn ngữ lập trình Java trong 6 tháng. Đặc biệt, bạn không cần phải lo lắng vấn đề công việc khi Rikkei Academy cam kết việc làm bằng văn bản! Đăng ký nhận tư vấn miễn phí ngay!