So sánh 2 mảng khác nhau java năm 2024

So sánh xem 2 mảng có giống nhau không là điều mà đôi khi chúng ta phải làm trong ứng dụng JavaScript của mình.

Trong bài viết này, chúng ta sẽ xem xét các cách để so sánh mảng trong JavaScript.

\>> Xem ngay Tài liệu Java Core giúp bạn “Nâng Cấp” kỹ năng lập trình

Vòng lặp for

Thông thường, chúng ta sẽ suy nghĩ đến các bước đơn giản nhất để so sánh mảng trong JavaScript. Đầu tiên là kiểm tra số lượng phần tử trong 2 mảng. Nếu khác nhau thì rõ ràng 2 mảng đó không thể giống nhau.

Khi mà số lượng phần tử trong 2 mảng bằng nhau, chúng ta sẽ kiểm tra các phần tử cùng vị trí để xem chúng có trùng nhau hay không.

So sánh 2 mảng khác nhau java năm 2024

Rất đơn giản, chúng ta có thể sử dụng vòng lặp for để thực hiện việc so sánh mảng trong JavaScript như sau:

`const a = [1, 2, 3, 5]; const b = [1, 2, 3, 5]; let isEqual; if(a.length !== b.length) { isEqual = false; } else { for (let i = 0; i < a.length; i++) {

   if(a[i] !== b[i]) {
       isEqual = false;
       break;
   }
   isEqual = true;
} } console.log(isEqual);`Code language: JavaScript (javascript)

Array.prototype.every

So sánh 2 mảng khác nhau java năm 2024

Nếu như việc thực hiện vòng lặp for để so sánh mảng trong JavaScript như ví dụ trên quá rườm ra, bạn có thể sử dụng phương thức every của mảng để kiểm tra xem mọi phần tử trong một mảng có nằm trong mảng mà chúng ta đang so sánh hay không.

Nếu chúng có cùng độ dài và mỗi phần tử trong một mảng này cũng nằm trong mảng kia, thì chúng ta biết rằng cả hai mảng đều giống nhau.

Ví dụ:

`const array1 = [1, 2, 3] const array2 = [1, 2, 3] const sameArray = array1.length === array2.length && array1.every((value, index) => value === array2[index]) console.log(sameArray)`Code language: JavaScript (javascript)

Chúng ta có 2 mảng array1 và array2 có nội dung giống nhau. Chúng ta kiểm tra xem cả hai có cùng độ dài hay không trước. Sau đó chúng ta gọi every để so sánh value với array2[index].

Lodash isEqual

Chúng ta cũng có thể sử dụng phương pháp Lodash’s isEqual để so sánh 2 mảng xem chúng có nội dung giống nhau hay không.

Ví dụ:

`const array1 = [1, 2, 3] const array2 = [1, 2, 3] const sameArray = _.isEqual(array1, array2) console.log(sameArray)`Code language: JavaScript (javascript)

Chúng ta chỉ cần đưa các mảng mà chúng ta muốn so sánh làm đối số của hàm isEqual.

JSON.stringify

So sánh 2 mảng khác nhau java năm 2024

Ngoài ra, chúng ta có thể thực hiện các phép so sánh mảng đơn giản với phương thức JSON.stringify.

Nó sẽ chuyển đổi mảng thành chuỗi JSON. Sau đó, chúng ta có thể so sánh các mảng được xâu chuỗi trực tiếp.

`const array1 = [1, 2, 3] const array2 = [1, 2, 3] const sameArray = JSON.stringify(array1) === JSON.stringify(array2); console.log(sameArray)`Code language: JavaScript (javascript)

Kết luận

Chúng ta có thể sử dụng một số cách để so sánh xem 2 mảng có giống nhau trong JavaScript hay không. Cách đơn giản nhất là sử dụng JSON.stringify để so sánh các phiên bản được xâu chuỗi của các mảng.

Ngoài ra, chúng ta có thể sử dụng phương thức every để kiểm tra từng phần tử của một mảng để xem chúng có giống nhau hay không.

Như các bạn đã biết, Java là một ngôn ngữ hướng đối tượng. Kết quả là thao tác với các đối tượng trong Java là thông lệ. Nhưng sớm hay muộn, bạn phải đối mặt với nhiệm vụ so sánh các đối tượng dựa trên một số đặc điểm. Ví dụ : Giả sử chúng ta có một số thông báo được mô tả bởi

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

7lớp:

  
public static class Message {  
    private String message;  
    private int id;  
    public Message(String message) {  
        this.message = message;  
        this.id = new Random().nextInt(1000);  
    }  
    public String getMessage() {  
        return message;  
    }  
    public Integer getId() {  
        return id;  
    }  
    public String toString() {  
        return "[" + id + "] " + message;  
    }  
}  

Đặt lớp này trong trình biên dịch Tutorialspoint Java . Đừng quên thêm các câu lệnh nhập:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

Trong

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

8phương thức này, hãy tạo một số thông báo:

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

Hãy nghĩ xem chúng ta sẽ làm gì nếu muốn so sánh chúng? Ví dụ: chúng tôi muốn sắp xếp theo id. Và để tạo một trật tự, chúng ta cần bằng cách nào đó so sánh các đối tượng để hiểu đối tượng nào nên đến trước (tức là đối tượng nhỏ hơn) và đối tượng nào nên theo sau (tức là đối tượng lớn hơn). Hãy bắt đầu với một lớp như java.lang.Object . Chúng ta biết rằng tất cả các lớp đều ngầm kế thừa

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

9lớp đó. Và điều này có ý nghĩa vì nó phản ánh khái niệm "mọi thứ đều là đối tượng" và cung cấp hành vi chung cho tất cả các lớp. Lớp này quy định rằng mọi lớp đều có hai phương thức: → Phương thức

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

0 này

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

1trả về một số (

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

  1. đại diện của đối tượng. Điều đó nghĩa là gì? Điều đó có nghĩa là nếu bạn tạo hai thể hiện khác nhau của một lớp, thì chúng phải có

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

1các s khác nhau. Mô tả của phương thức nói rất nhiều: "Trong thực tế hợp lý, phương thức hashCode được xác định bởi lớp Object sẽ trả về các số nguyên riêng biệt cho các đối tượng riêng biệt". Nói cách khác, đối với hai

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

4s khác nhau, sẽ có

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

1những s khác nhau. Đó là, phương pháp này không phù hợp để so sánh của chúng tôi. →

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

6. Phương

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

7thức trả lời câu hỏi "các đối tượng này có bằng nhau không?" và trả về một

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

8." Theo mặc định, phương thức này có mã sau:

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

Nghĩa là, nếu phương thức này không bị ghi đè, thì về cơ bản, nó cho biết liệu các tham chiếu đối tượng có khớp hay không. Đây không phải là điều chúng tôi muốn cho thư của mình, bởi vì chúng tôi quan tâm đến id thư chứ không phải tham chiếu đối tượng. Và ngay cả khi chúng ta ghi đè

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

7phương thức, điều chúng ta có thể hy vọng nhất là tìm hiểu xem chúng có bằng nhau hay không. Và điều này là không đủ để chúng tôi xác định thứ tự. Vậy chúng ta cần gì sau đó? Chúng ta cần một cái gì đó để so sánh. Người so sánh là a

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

0. Mở API Java và tìm Bộ so sánh . Thật vậy, có một

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

1giao diện

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

2 Như bạn có thể thấy, một giao diện như vậy tồn tại. Một lớp triển khai nó nói, "Tôi triển khai một phương thức so sánh các đối tượng." Điều duy nhất bạn thực sự cần nhớ là hợp đồng so sánh, được thể hiện như sau:

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

Bây giờ hãy viết một bộ so sánh. Chúng tôi sẽ cần phải nhập khẩu

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

3. Sau câu lệnh nhập, hãy thêm phần sau vào

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

8phương thức:

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

5 Tất nhiên, điều này sẽ không hoạt động, vì

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

0là một giao diện. Vì vậy, chúng tôi thêm dấu ngoặc nhọn

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

7sau dấu ngoặc đơn. Viết phương thức sau bên trong dấu ngoặc nhọn:

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

Bạn thậm chí không cần phải nhớ chính tả. Người so sánh là người thực hiện so sánh, tức là so sánh. Để chỉ ra thứ tự tương đối của các đối tượng, chúng tôi trả về một

  
public static void main(String[] args){  
    List<Message> messages = new ArrayList();  
    messages.add(new Message("Hello, World!"));  
    messages.add(new Message("Hello, Sun!"));  
    System.out.println(messages);  
}  

2. Về cơ bản là vậy. Tốt đẹp và dễ dàng. Như bạn có thể thấy từ ví dụ, ngoài Bộ so sánh, còn có một giao diện khác —

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

9, giao diện này yêu cầu chúng tôi triển khai

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

0phương thức. Giao diện này cho biết, "một lớp triển khai tôi giúp so sánh các thể hiện của lớp đó." Ví dụ:

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

1việc triển khai

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

2To như sau:

  
(x < y) ? -1 : ((x == y) ? 0 : 1)  

Java 8 đã giới thiệu một số thay đổi thú vị. Nếu bạn nhìn kỹ vào

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

0giao diện, bạn sẽ thấy

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

4chú thích phía trên nó. Chú thích này dành cho mục đích thông tin và cho chúng tôi biết rằng giao diện này đang hoạt động. Điều này có nghĩa là giao diện này chỉ có 1 phương thức trừu tượng, là phương thức không có triển khai. Điều này mang lại cho chúng ta điều gì? Bây giờ chúng ta có thể viết mã của bộ so sánh như thế này:

  
Comparator<Message> comparator = (o1, o2) -> o1.getId().compareTo(o2.getId());  

Chúng tôi đặt tên cho các biến trong ngoặc đơn. Java sẽ thấy rằng vì chỉ có một phương thức nên số lượng và loại tham số đầu vào cần thiết là rõ ràng. Sau đó, chúng tôi sử dụng toán tử mũi tên để chuyển chúng đến phần mã này. Hơn nữa, nhờ có Java 8, giờ đây chúng ta có các phương thức mặc định trong các giao diện. Các phương thức này xuất hiện theo mặc định khi chúng ta triển khai một giao diện. Giao

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

0diện có một số. Ví dụ:

  
Comparator moreImportant = Comparator.reverseOrder();  
Comparator lessImportant = Comparator.naturalOrder();  

Có một phương pháp khác sẽ làm cho mã của bạn sạch hơn. Hãy xem ví dụ trên, nơi chúng tôi đã xác định bộ so sánh của mình. Nó làm gì? Nó khá nguyên thủy. Nó chỉ đơn giản là lấy một đối tượng và trích xuất một số giá trị "có thể so sánh được". Ví dụ:

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

1implements

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

7, vì vậy chúng tôi có thể thực hiện thao tác so sánh trên các giá trị của trường id thông báo. Hàm so sánh đơn giản này có thể được viết như sau:

  
Comparator<Message> comparator = Comparator.comparing(obj -> obj.getId());  

Nói cách khác, chúng ta có một

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

0phép so sánh như sau: nó lấy các đối tượng, sử dụng

  
Comparator returns an int according to the following rules:   
  
  • It returns a negative int if the first object is smaller
  • It returns a positive int if the first object is larger
  • It returns zero if the objects are equal

9phương thức để lấy một

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

0từ chúng, sau đó sử dụng

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

1để so sánh. Và không có cấu trúc khủng khiếp hơn. Và cuối cùng, tôi muốn lưu ý một tính năng nữa. Bộ so sánh có thể được xâu chuỗi. Ví dụ:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

0

Ứng dụng

Tuyên bố một bộ so sánh hóa ra khá hợp lý, bạn có nghĩ vậy không? Bây giờ chúng ta cần xem làm thế nào và ở đâu để sử dụng nó. →

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

2 Tất nhiên, chúng ta có thể sắp xếp các tập hợp theo cách này. Nhưng không phải mọi bộ sưu tập, chỉ danh sách. Không có gì bất thường ở đây, bởi vì danh sách là loại bộ sưu tập nơi bạn truy cập các phần tử theo chỉ mục của chúng. Điều này cho phép hoán đổi phần tử thứ hai với phần tử thứ ba. Đó là lý do tại sao phương pháp sắp xếp sau đây chỉ dành cho danh sách:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

1

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

3 Mảng cũng dễ sắp xếp. Một lần nữa, vì lý do tương tự - các phần tử của chúng được truy cập theo chỉ mục. →

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

4 Bạn sẽ nhớ lại điều đó

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

5và

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

6không đảm bảo thứ tự các phần tử được lưu trữ. NHƯNG, chúng tôi có các triển khai đặc biệt đảm bảo thứ tự. Và nếu các phần tử của bộ sưu tập không triển khai

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

7, thì chúng ta có thể chuyển a

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

0tới hàm tạo của nó:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

2

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

9 Trong API luồng, xuất hiện trong Java 8, bộ so sánh cho phép bạn đơn giản hóa công việc với các phần tử luồng. Ví dụ: giả sử chúng ta cần một dãy số ngẫu nhiên từ 0 đến 999, bao gồm:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

3

Chúng ta có thể dừng lại ở đây, nhưng còn nhiều vấn đề thú vị hơn nữa. Ví dụ: giả sử bạn cần chuẩn bị một

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

6, trong đó khóa là id thư. Ngoài ra, chúng tôi muốn sắp xếp các khóa này, vì vậy chúng tôi sẽ bắt đầu với đoạn mã sau:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

4

Chúng tôi thực sự nhận được một

  
(x < y) ? -1 : ((x == y) ? 0 : 1)  

1ở đây. Và như chúng ta biết, nó không đảm bảo bất kỳ thứ tự nào. Do đó, các phần tử của chúng tôi, được sắp xếp theo id, chỉ đơn giản là mất thứ tự. Không tốt. Chúng ta sẽ phải thay đổi bộ sưu tập của mình một chút:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

5

Mã đã bắt đầu trông đáng sợ hơn một chút, nhưng bây giờ vấn đề đã được giải quyết chính xác. Đọc thêm về các nhóm khác nhau ở đây:

  • Java 8 – Stream Collectors groupingBy ví dụ

Bạn có thể tạo bộ sưu tập của riêng bạn. Đọc thêm tại đây: "Tạo trình thu thập tùy chỉnh trong Java 8" . Và bạn sẽ được lợi khi đọc phần thảo luận tại đây: "Danh sách Java 8 để ánh xạ với luồng" .

bẫy rơi

  
public boolean equals(Object obj) {  
    return (this == obj);  
}  

0và

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

0là tốt. Nhưng có một sắc thái bạn nên nhớ. Khi một lớp thực hiện sắp xếp, nó hy vọng rằng lớp của bạn có thể được chuyển đổi thành tệp

  
public int compare(Message o1, Message o2) {  
    return o1.getId().compareTo(o2.getId());  
}  

0. Nếu đây không phải là trường hợp, thì bạn sẽ gặp lỗi trong thời gian chạy. Hãy xem xét một ví dụ:

  
import java.util.Random;  
import java.util.ArrayList;  
import java.util.List;  

6

Có vẻ như không có gì là sai ở đây. Nhưng trên thực tế, trong ví dụ của chúng ta, nó sẽ thất bại với lỗi:

  
(x < y) ? -1 : ((x == y) ? 0 : 1)  

5 Và tất cả chỉ vì nó đã cố gắng sắp xếp các phần tử (

  
(x < y) ? -1 : ((x == y) ? 0 : 1)  

6rốt cuộc nó là một )...nhưng không thể. Đừng quên điều này khi làm việc với

  
(x < y) ? -1 : ((x == y) ? 0 : 1)  

7và

  
(x < y) ? -1 : ((x == y) ? 0 : 1)  

6.