So sánh 2 chuỗi bằng compare năm 2024

Nếu bạn nhớ

  
[Dasha, Masha, Sasha]  

7lớp và

  
[Dasha, Masha, Sasha]  

8phương thức của nó, thì tốt lắm! Tôi nghĩ bạn cũng sẽ không gặp rắc rối với những con số. Đây là một nhiệm vụ khó khăn hơn cho bạn:

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

Nhiệm vụ thực sự đơn giản. Chúng ta có một

  
[Dasha, Masha, Sasha]  

9lớp và 3 đối tượng Car. Bạn vui lòng sắp xếp những chiếc xe trong danh sách? Bạn có thể sẽ hỏi, "Làm thế nào chúng nên được sắp xếp?" Bằng tên? Theo năm sản xuất? Bằng tốc độ tối đa? Câu hỏi tuyệt vời. Hiện tại, chúng tôi không biết cách sắp xếp các

  
[Dasha, Masha, Sasha]  

9đối tượng. Và, một cách hoàn toàn tự nhiên, Java cũng không biết điều đó! Khi chúng tôi cố gắng chuyển một danh sách

  
[Dasha, Masha, Sasha]  

9các đối tượng cho

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

2phương thức, chúng tôi gặp lỗi:

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

Và thực sự, làm thế nào để ngôn ngữ biết cách sắp xếp các đối tượng của các lớp mà bạn đã viết? Điều này phụ thuộc vào những gì chương trình của bạn cần làm. Bằng cách nào đó, chúng ta phải dạy Java so sánh các đối tượng này. Và để so sánh chúng theo cách chúng ta muốn. Java có một cơ chế đặc biệt cho việc này:

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

3giao diện. Để bằng cách nào đó so sánh và sắp xếp

  
[Dasha, Masha, Sasha]  

9các đối tượng của chúng ta, lớp phải triển khai giao diện này, bao gồm một phương thức duy nhất:

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5:

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

Xin lưu ýmà chúng tôi đã chỉ định

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

6giao diện, không chỉ

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

3. Đây là một giao diện được tham số hóa, tức là chúng ta phải chỉ định lớp liên quan cụ thể. Về nguyên tắc, bạn có thể xóa

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

8khỏi giao diện, nhưng khi đó việc so sánh sẽ

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

9mặc định dựa trên các đối tượng. Thay vì

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

0phương thức, lớp của chúng ta sẽ có:

  
@Override  
   public int compareTo(Object o) {  
       return 0;  
   }  

Tất nhiên, chúng tôi làm việc với

  
[Dasha, Masha, Sasha]  

9. Bên trong

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5phương thức, chúng tôi triển khai logic của mình để so sánh ô tô. Giả sử chúng ta cần sắp xếp chúng theo năm sản xuất. Bạn có thể nhận thấy rằng

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5phương thức này trả về một

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

4, không phải một

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

5. Đừng để điều này làm bạn ngạc nhiên. Khi chúng ta so sánh hai đối tượng, có 3 khả năng xảy ra:

  • import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) {

       List cars = new ArrayList<>();  
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
       // Compilation error!  
       Collections.sort(cars);  
    
    } }

    6
  • import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) {

       List cars = new ArrayList<>();  
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
       // Compilation error!  
       Collections.sort(cars);  
    
    } }

    7
  • import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) {

       List cars = new ArrayList<>();  
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
       // Compilation error!  
       Collections.sort(cars);  
    
    } }

    8.

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

5chỉ có 2 giá trị: đúng và sai, không hoạt động tốt để so sánh các đối tượng. Với

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

4, mọi thứ đơn giản hơn nhiều. Nếu giá trị trả về là

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

1, thì

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

7. Nếu kết quả của

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

3là

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

4, thì

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

5. Và, nếu kết quả là

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

6, thì hai đối tượng bằng nhau:

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

8. Dạy lớp chúng ta phân loại ô tô theo năm sản xuất thật dễ dàng:

  
@Override  
public int compareTo(Car o) {  
   return this.getManufactureYear() - o.getManufactureYear();  
}  

Nhưng những gì đang xảy ra ở đây? Chúng tôi lấy một đối tượng Ô tô (

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

8), lấy năm sản xuất của ô tô này và trừ đi năm sản xuất của một ô tô khác (chiếc mà đối tượng đang được so sánh với nó). Nếu năm sản xuất của chiếc ô tô đầu tiên lớn hơn, phương thức sẽ trả về một

  
public class Car implements Comparable {
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }
   @Override  
   public int compareTo(Car o) {  
       return 0;  
   }
   // ...getters, setters, toString()
}  

9. Điều này có nghĩa là chiếc

  
@Override  
   public int compareTo(Object o) {  
       return 0;  
   }  

0xe

  
@Override  
   public int compareTo(Object o) {  
       return 0;  
   }  

1. Ngược lại, nếu năm sản xuất của chiếc ô tô thứ hai (

  
@Override  
   public int compareTo(Object o) {  
       return 0;  
   }  

  1. lớn hơn thì phương thức sẽ trả về một số âm, nghĩa là

  
@Override  
   public int compareTo(Object o) {  
       return 0;  
   }  

3. Cuối cùng, nếu chúng bằng nhau thì phương thức sẽ trả về

  
@Override  
   public int compareTo(Object o) {  
       return 0;  
   }  

4. Cơ chế đơn giản này đã đủ để chúng ta sắp xếp các bộ sưu tập

  
[Dasha, Masha, Sasha]  

9đối tượng! Bạn không phải làm bất cứ điều gì khác. Kiểm tra nó ra:

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // There was previously an error here  
       Collections.sort(cars);  
       System.out.println(cars);  
   }  
}  

Đầu ra bảng điều khiển:

  
[Car{manufactureYear=1990, model='Ferrari 360 Spider', maxSpeed=310},   
Car{manufactureYear=2010, model='Bugatti Veyron', maxSpeed=350},   
Car{manufactureYear=2012, model='Lamborghini Gallardo', maxSpeed=290}]  

Những chiếc xe được sắp xếp như chúng ta muốn! :)

So sánh 2 chuỗi bằng compare năm 2024
Khi nào tôi nên sử dụng
  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

3? Phương pháp so sánh được thực hiện trong

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

3được gọi là thứ tự tự nhiên. Điều này là do trong

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5phương thức bạn định nghĩa cách phổ biến nhất hoặc tự nhiên nhất để so sánh các đối tượng của lớp này. Java đã có thứ tự tự nhiên. Ví dụ, Java biết rằng các chuỗi thường được sắp xếp theo thứ tự bảng chữ cái và các số theo giá trị số tăng dần. Do đó, nếu bạn gọi

  
[Dasha, Masha, Sasha]  

8phương thức trên danh sách các số hoặc chuỗi, chúng sẽ được sắp xếp. Nếu chương trình của chúng ta thường so sánh và sắp xếp ô tô theo năm sản xuất, thì chúng ta nên xác định cách sắp xếp tự nhiên cho Ô tô bằng cách sử dụng giao

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

6diện và

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5phương pháp. Nhưng nếu điều này là không đủ cho chúng ta thì sao? Hãy tưởng tượng rằng chương trình của chúng ta không đơn giản như vậy. Trong hầu hết các trường hợp, việc phân loại ô tô tự nhiên (mà chúng tôi đã thiết lập để thực hiện theo năm sản xuất) phù hợp với chúng tôi. Nhưng đôi khi khách hàng của chúng tôi là những người đam mê lái xe nhanh. Nếu chúng ta đang chuẩn bị một danh mục ô tô để họ nghiên cứu, thì ô tô nên được sắp xếp theo tốc độ tối đa.

So sánh 2 chuỗi bằng compare năm 2024
Ví dụ: giả sử chúng ta cần sắp xếp như thế này 15% thời gian. Điều này rõ ràng là không đủ để chúng tôi thiết lập
  
[Dasha, Masha, Sasha]  

9phân loại tự nhiên của lớp theo tốc độ thay vì theo năm sản xuất. Nhưng chúng tôi không thể bỏ qua 15% khách hàng của mình. Vậy ta phải làm sao? Một giao diện khác hỗ trợ chúng tôi tại đây:

  
@Override  
public int compareTo(Car o) {  
   return this.getManufactureYear() - o.getManufactureYear();  
}  

3. Giống như

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

3, nó là một giao diện được tham số hóa. Có gì khác biệt?

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

3làm cho các đối tượng của chúng ta "có thể so sánh được" và xác định thứ tự sắp xếp tự nhiên nhất của chúng, tức là thứ tự sắp xếp sẽ được sử dụng trong hầu hết các trường hợp.

  
@Override  
public int compareTo(Car o) {  
   return this.getManufactureYear() - o.getManufactureYear();  
}  

3là một giao diện "so sánh" riêng biệt. Nếu chúng ta cần thực hiện một số loại thứ tự sắp xếp đặc biệt, chúng ta không cần phải vào lớp

  
[Dasha, Masha, Sasha]  

9và thay đổi logic của

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5. Thay vào đó, chúng ta có thể tạo một lớp riêng thực hiện Bộ so sánh và dạy nó cách thực hiện sắp xếp mà chúng ta cần!

  
import java.util.Comparator;
public class MaxSpeedCarComparator implements Comparator {  
   @Override  
   public int compare(Car o1, Car o2) {  
       return o1.getMaxSpeed() - o2.getMaxSpeed();  
   }  
}  

Như bạn có thể thấy, của chúng tôi

  
@Override  
public int compareTo(Car o) {  
   return this.getManufactureYear() - o.getManufactureYear();  
}  

3là khá đơn giản. Chúng ta chỉ cần triển khai một phương thức giao diện:

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // There was previously an error here  
       Collections.sort(cars);  
       System.out.println(cars);  
   }  
}  

0. Nó lấy hai

  
[Dasha, Masha, Sasha]  

9đối tượng làm đầu vào và so sánh tốc độ tối đa của chúng theo cách thông thường (bằng phép trừ). Like

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5, nó trả về an

  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(20012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);
       // Compilation error!  
       Collections.sort(cars);  
   }  
}  

4và nguyên tắc so sánh là giống nhau. Làm thế nào để chúng tôi sử dụng này? Tất cả đều đơn giản:

  
[Dasha, Masha, Sasha]  

0

Đầu ra bảng điều khiển:

  
[Dasha, Masha, Sasha]  

1

Chúng ta chỉ cần tạo một đối tượng so sánh và truyền nó cho

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

2phương thức cùng với danh sách cần sắp xếp. Khi

  
[Dasha, Masha, Sasha]  

8phương thức nhận được một bộ so sánh, nó không sử dụng cách sắp xếp tự nhiên được định nghĩa trong phương thức

  
[Dasha, Masha, Sasha]  

9của lớp

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

5. Thay vào đó, nó áp dụng thuật toán sắp xếp được xác định bởi bộ so sánh được truyền cho nó. những lợi thế của việc này là gì? Đầu tiên, khả năng tương thích với mã hiện có. Chúng tôi đã tạo một phương pháp sắp xếp mới, đặc biệt, trong khi vẫn giữ nguyên phương pháp hiện tại sẽ được sử dụng thường xuyên. Chúng tôi đã không chạm vào

  
[Dasha, Masha, Sasha]  

9lớp học cả. Đó là một

  
public class Car {  
   private int manufactureYear;  
   private String model;  
   private int maxSpeed;
   public Car(int manufactureYear, String model, int maxSpeed) {  
       this.manufactureYear = manufactureYear;  
       this.model = model;  
       this.maxSpeed = maxSpeed;  
   }  
   // ...getters, setters, toString()  
}
import java.util.ArrayList;  
import java.util.List;
public class Main {
   public static void main(String[] args) {
       List cars = new ArrayList<>();
       Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);  
       Car lambo = new Car(2012, "Lamborghini Gallardo", 290);  
       Car bugatti = new Car(2010, "Bugatti Veyron", 350);  
       cars.add(ferrari);  
       cars.add(bugatti);  
       cars.add(lambo);  
   }  
}  

3, và vì vậy nó vẫn là:

  
[Dasha, Masha, Sasha]  

2

Thứ hai, tính linh hoạt. Chúng ta có thể thêm bao nhiêu thuật toán sắp xếp tùy thích. Ví dụ: chúng ta có thể sắp xếp ô tô theo màu sắc, tốc độ, trọng lượng hoặc theo số lần ô tô đã được sử dụng trong phim Batman. Tất cả những gì chúng ta cần làm là tạo một tệp

  
@Override  
public int compareTo(Car o) {  
   return this.getManufactureYear() - o.getManufactureYear();  
}  

3. Đó là nó! Hôm nay bạn đã nghiên cứu hai cơ chế rất quan trọng mà bạn sẽ thường sử dụng trong các dự án thực tế tại nơi làm việc. Nhưng, như bạn đã biết, lý thuyết mà không có thực hành là không có gì. Bây giờ là lúc để củng cố kiến ​​​​thức của bạn và hoàn thành một số nhiệm vụ!