1.JAVA中Comprarable和Comparator接口的区别
Comprarable | Comparator |
这个接口提供单一的排序规则 | 这个接口提供多种排序规则 |
我们需要修改原类(即原类需要继承这个接口) | 原类不需要修改(需要继承这个接口) |
我们需要重写compareTo()方法来对元素进行排序 | 我们需要重写compare()方法来对元素进行排序 |
通常用来实现类内部的自然排序规则 | 通常用于外部定制化的排序规则 |
他需要被需要排序的类给继承 | 他需要被一个单独的类给实现继承 |
Comparable接口的使用例子:
// Java program to demonstrate
// the use of Comparable for sorting
import java.util.ArrayList;
import java.util.Collections;
// Movie class implements Comparable
// interface to define default sorting
class Movie implements Comparable<Movie> {
private String n; // Movie Name
private double r; // Movie Rating
private int y; // Release year of the movie
// Constructor
public Movie(String n, double r, int y) {
this.n = n;
this.r = r;
this.y = y;
}
// Implementation of the compareTo method
// for default sorting by year
public int compareTo(Movie m) {
// Sort movies in ascending
// order of year
return this.y - m.y;
}
// Getter and Setter method
public String getName() {
return n;
}
public double getRating() {
return r;
}
public int getYear() {
return y;
}
}
public class Main {
public static void main(String[] args) {
// Create a list of movies
ArrayList<Movie> l = new ArrayList<>();
l.add(new Movie("Star Wars", 8.7, 1977));
l.add(new Movie("Empire Strikes Back", 8.8, 1980));
l.add(new Movie("Return of the Jedi", 8.4, 1983));
// Sort movies using Comparable's
// compareTo method by year
Collections.sort(l);
// Display the sorted list of movies
System.out.println("Movies after sorting by year:");
for (Movie m : l) {
System.out.println(m.getName() + " " + m.getRating() + " " + m.getYear());
}
}
}
output:
Comparator例子:
// Java program to demonstrate Comparator interface
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class Movie {
private String n; // Movie name
private double r; // Movie rating
private int y; // Movie year
// Constructor to initialize movie details
public Movie(String n, double r, int y) {
this.n = n;
this.r = r;
this.y = y;
}
// Getter methods
public String getN() {
return n;
}
public double getR() {
return r;
}
public int getY() {
return y;
}
}
// Comparator to sort movies by rating
class Rating implements Comparator<Movie> {
public int compare(Movie m1, Movie m2) {
// Sort by rating in descending order
return Double.compare(m2.getR(), m1.getR());
}
}
// Comparator to sort movies by name
class NameCompare implements Comparator<Movie> {
public int compare(Movie m1, Movie m2) {
// Sort by name in alphabetical order
return m1.getN().compareTo(m2.getN());
}
}
// Main class
public class Main {
public static void main(String[] args) {
// Create a list of movies
ArrayList<Movie> m = new ArrayList<>();
m.add(new Movie("Force Awakens", 8.3, 2015));
m.add(new Movie("Star Wars", 8.7, 1977));
m.add(new Movie("Empire Strikes Back", 8.8, 1980));
// Sort movies by rating and display all
Collections.sort(m, new Rating());
System.out.println("Movies sorted by rating:");
for (Movie m1 : m) {
System.out.println(m1.getR() + " " + m1.getN() + " " + m1.getY());
}
// Sort movies by name and display all
Collections.sort(m, new NameCompare());
System.out.println("\nMovies sorted by name:");
for (Movie m1 : m) {
System.out.println(m1.getN() + " " + m1.getR() + " " + m1.getY());
}
}
}
output:
参考文献:Java Collections Interview Questions and Answers | GeeksforGeeks