JavaRush /Blog Java /Random-VI /phương thức so sánh

phương thức so sánh

Xuất bản trong nhóm
Để sắp xếp các đối tượng cùng loại được lưu trữ trong một mảng hoặc bộ sưu tập, các nhà phát triển Java đã đưa ra định dạng Comparable. Nó chỉ khai báo một phương thức compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
phương thức so sánh - 1Một giao diện Comparableđược tham số hóa theo loại đối tượng mà nó chấp nhận làm tham số cho phương thức compareTo. Trong trường hợp này, chúng tôi cảnh báo trình biên dịch về loại đối tượng mà chúng tôi sẽ so sánh. Nếu điều kiện nhận dạng loại không được đáp ứng, chúng tôi sẽ nhận được lỗi ClassCastException. Một phương thức compareTotrong Java so sánh đối tượng đang gọi với đối tượng được truyền dưới dạng tham số và trả về một số nguyên do so sánh:
  • dương nếu đối tượng gọi lớn hơn đối tượng được truyền dưới dạng tham số;
  • âm nếu đối tượng gọi nhỏ hơn đối tượng được truyền dưới dạng tham số;
  • null nếu các đối tượng bằng nhau.
Viết logic so sánh đối tượng là mối quan tâm duy nhất của nhà phát triển lớp và được xác định bởi kết quả đặt hàng mong muốn.

Tại sao cần có phương thức so sánh trong Java?

Một lập trình viên Java thường xuyên phải xử lý các mảng và danh sách các đối tượng. Khi làm việc với lượng lớn dữ liệu, việc lưu trữ nó ở dạng có tổ chức hoặc được sắp xếp thường rất thuận tiện. Thứ nhất, nó tăng tốc độ làm việc với bộ sưu tập khi tìm kiếm thông tin cần thiết và thứ hai, dữ liệu có tổ chức được nhận biết trực quan tốt hơn.
phương thức so sánh - 2
Một trong những cách đơn giản và hiệu quả nhất để sắp xếp một mảng các đối tượng là phương thức sort()lớp Arrays, và một tập hợp các đối tượng ở dạng danh sách cũng là một phương thức lớp tương tự Collections. Để sắp xếp bằng các phương thức này, các nhà phát triển Java đã cho phép chúng tôi tự do lựa chọn cách chỉ định tiêu chí sắp xếp: bằng cách triển khai giao diện Comparabletrong lớp đối tượng mà chúng tôi muốn sắp xếp hoặc bằng cách sử dụng tệp Comparator. Trong trường hợp đầu tiên, các phương thức sắp xếp chấp nhận một tập hợp các đối tượng ở dạng mảng hoặc danh sách:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
và trong phần thứ hai - cộng với cách triển khai giao diện khác Comparator:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Giao diện Comparableđược sử dụng khi chúng ta muốn thiết lập thứ tự tự nhiên (hợp lý nhất theo quan điểm của chúng ta) cho các đối tượng khi sắp xếp. Nó cũng là một cách để “kết nối cứng” thuật toán để so sánh các đối tượng thuộc lớp này ở giai đoạn thiết kế. Ví dụ: bằng cách sử dụng cách triển khai giao diện này, các tiêu chí về thứ tự tự nhiên trong các lớp bao bọc của các kiểu nguyên thủy chính được xác định: , , Byte, Character, Long, Integer, Short, Double, Float. Điều này cũng có nghĩa là các lớp này có một phương thức được triển khai mà chúng ta có thể sử dụng trong chương trình nếu cần. Hãy xem một ví dụ về so sánh chuỗi để xem phương thức này được triển khai như thế nào trong lớp . BooleanStringcompareToString
String str1="Аарон";
        String str2="АAPOH";
        String str3="аарон";
        String str4="ААрон";
        String str5="аАрон";
        String str6="Берта";
        String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
        Arrays.sort(allStr);
        for (String s:allStr){
            System.out.println(s);
        }
    }
Nếu chúng ta thực thi mã này trong phương thức main, chúng ta sẽ nhận được kết quả sau:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Như bạn có thể thấy trong ví dụ trong lớp String, phương thức này compareTosắp xếp các chuỗi theo thứ tự bảng chữ cái, từ điển và phân biệt chữ hoa chữ thường. Thứ tự so sánh chuỗi này được các nhà phát triển lớp xác định Stringlà tự nhiên. Để hiểu đơn giản hơn về thứ tự từ điển là gì, chỉ cần nhớ cách sắp xếp các từ trong từ điển ngôn ngữ là đủ. Khi so sánh các số, các đối tượng được sắp xếp theo thứ tự tăng dần. Logic so sánh này được nhúng trong các lớp Byte, Character, Long, Integer, Shor, Double.Float

Hãy thực hiện so sánh trong lớp của chúng tôi

Hãy xem một ví dụ về cách bạn có thể xây dựng khả năng so sánh các đối tượng trong lớp của mình. Khi triển khai một comparetophương thức Java, chúng ta có thể chỉ định một hoặc nhiều tiêu chí để sắp xếp các đối tượng và cũng có thể sử dụng các phương thức comparetotừ các lớp StringInteger. Ví dụ: đối với các đối tượng lớp, Userchúng tôi đặt sắp xếp theo tên và trong trường hợp tên giống nhau thì sắp xếp theo tuổi. Các đồ vật sẽ được sắp xếp theo thứ tự tự nhiên (khi giá trị tăng lên). Lớp học User:
public class User  implements Comparable <User>{//добавляем возможность сравнивать an objectы User

    private String name;
    private Integer age;
    private String email;

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    @Override
//реализуем метод compareTo интерфейса Comparable
    public int compareTo(User o) {

//используем метод compareTo из класса String для сравнения имен
        int result = this.name.compareTo(o.name);

//если имена одинаковые -  сравниваем возраст,
используя метод compareTo из класса Integer

        if (result == 0) {
            result = this.age.compareTo(o.age);
        }
        return result;
    }

    @Override
    public String toString() {
        return "{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
Hãy kiểm tra hoạt động của phương thức compareTođược triển khai trong lớp Userbằng phương thức sortlớp Collections:
public static void main(String[] args) {
    User user = new User("Andrey", 19, "andryha@mail.ru");
    User user2 = new User("Олег", 25, "oleg@mail.ru");
    User user3 = new User("Andrey", 24,"opr@google.com");
    User user4 = new User("Igor", 16, "igor@mail.ru");
    User user5 = new User("Andrey", 44,"stary@google.com");
    List<User> list = new ArrayList<>();

    list.add(user);
    list.add(user2);
    list.add(user3);
    list.add(user4);
    list.add(user5);

    System.out.println("-------до сортировки--------");
    for (User u : list) {
        System.out.println(u);
    }
    System.out.println("-------после сортировки-----");
    Collections.sort(list);
    for (User u : list) {
        System.out.println(u);
    }
}
 }
}
Kết quả của phương pháp main:
-------до сортировки--------
{name='Андрей',  age=19,  email='andryha@mail.ru'}
{name='Олег',    age=25,  email='oleg@mail.ru'}
{name='Андрей',  age=24,  email='opr@google.com'}
{name='Игорь',   age=16,  email='igor@mail.ru'}
{name='Андрей',  age=44,  email='stary@google.com'}
-------после сортировки-----
{name='Андрей',  age=19,  email='andryha@mail.ru'}
{name='Андрей',  age=24,  email='opr@google.com'}
{name='Андрей',  age=44,  email='stary@google.com'}
{name='Игорь',   age=16,  email='igor@mail.ru'}
{name='Олег',    age=25,  email='oleg@mail.ru'}
Vì vậy, hãy tóm tắt. Nếu bạn là người ủng hộ trật tự trong mọi thứ và muốn sắp xếp các đối tượng của mình thành một mảng hoặc danh sách mà không cần mã không cần thiết, hãy sử dụng giao diện Comparable. Việc triển khai phương thức so sánh của nó giúp bạn dễ dàng xây dựng cơ chế sắp xếp các đối tượng một cách tự nhiên trong lớp của mình. Nếu bạn phải làm việc với các bộ sưu tập và mảng đối tượng của các lớp tiêu chuẩn được mô tả trong thư viện Java, hãy sử dụng các triển khai có sẵn compareTotrong các lớp này.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION