JAVA常见面试题(三)

1.JAVA中Comprarable和Comparator接口的区别

ComprarableComparator
这个接口提供单一的排序规则这个接口提供多种排序规则
我们需要修改原类(即原类需要继承这个接口)原类不需要修改(需要继承这个接口)
我们需要重写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

Java Comparable vs Comparator | GeeksforGeeks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值