如何修复我的比较字符串与 compareTo() 的代码

How to fix my code of comparing String with compareTo()

我编写了这段代码来按名称对电影进行排序,它是一个字符串,但它并没有对它进行排序。

另外,我应该如何根据年份属性比较两个 movies

//public int compareTo(Movies m) { return this.year-m.year; } 

我很困惑,我们在 sort 方法中传递了整个列表时,正在比较哪个 m 对象。

import java.util.*;

class Movies implements Comparable<Movies> {
    private double rating;
    private String name;
    private int year;

    // Used to sort movies by year
    public int compareTo(Movies m) {
        return this.getName().compareTo(m.getName());

    }

    // Constructor
    public Movies(String nm, double rt, int yr) {
        this.name = nm;
        this.rating = rt;
        this.year = yr;
    }

    public void thisee() {
        System.out.println(this.year);
    }

    // Getter methods for accessing private data
    public double getRating() {
        return rating;
    }

    public String getName() {
        return name;
    }

    public int getYear() {
        return year;
    }

    public static void main(String[] args) {
        ArrayList<Movie> list = new ArrayList<Movie>();
        list.add(new Movie("Force Awakens", 8.3, 2015));
        list.add(new Movie("Star Wars", 8.7, 1977));
        list.add(new Movie("Empire Strikes Back", 8.8, 1980));
        list.add(new Movie("Return of the Jedi", 8.4, 1983));

        Collections.sort(list);

        System.out.println("Movies after sorting : ");
        for (Movie movie : list) {
            System.out.println(movie.getName() + " " + movie.getRating() + " " + movie.getYear());
        }
    }
}

Comparable.compareTo(o)的总合同是return

  • 如果 this(Comparable) 大于 other object(o),则为正整数。
  • 如果低于另一个对象,则为负整数。
  • 0 如果这等于另一个对象。

因此,要比较两部电影的年份,您需要为两部电影创建整数对象,然后进行比较。

// Used to sort movies by year
public int compareTo(Movies m) {
    Integer movie1 = Integer.valueOf(this.getYear());
    Integer movie2 = Integer.valueOf(m.getYear());
    return movie1.compareTo(movie2);
}

输出(按年份排序):

Movies after sorting : 
Star Wars 8.7 1977
Empire Strikes Back 8.8 1980
Return of the Jedi 8.4 1983
Force Awakens 8.3 2015

P.S 如果您想按名称排序,您的代码可以正常工作,只需更改 main

public static void main(String[] args) {
    // The class you created is Movies not Movie (IDK if that was typo)
    ArrayList<Movies> list = new ArrayList<Movies>();
    list.add(new Movies("Force Awakens", 8.3, 2015));
    list.add(new Movies("Star Wars", 8.7, 1977));
    list.add(new Movies("Empire Strikes Back", 8.8, 1980));
    list.add(new Movies("Return of the Jedi", 8.4, 1983));

    Collections.sort(list);

    System.out.println("Movies after sorting : ");
    for (Movies movie : list) {
       System.out.println(movie.getName() + " " + movie.getRating() + " " + 
       movie.getYear());
    }
}

输出(按名称排序):

Movies after sorting : 
Empire Strikes Back 8.8 1980
Force Awakens 8.3 2015
Return of the Jedi 8.4 1983
Star Wars 8.7 1977

如果您希望能够有时按名称排序有时按年份排序,而不必修改电影 class 来执行此操作,那么您可以将顺序嵌入单独的 'comparator'正在比较的对象而不是电影中的对象。

public class MoviesByName implements Comparator<Movie> {
   public int compare(Movie m1, Movie m2) {
       return m1.getName().compareTo(m2.getName());
   }
}

public class MoviesByYear implements Comparator<Movie> {
   public int compare(Movie m1, Movie m2) {
       return m1.getYear() - m2.getYear(); 
   }
}

然后

Collections.sort(list, new MoviesByName());

Collections.sort(list, new MoviesByYear());

这种方法表示没有适用于 'Movies' 的单一顺序 - 您在进行排序时定义所需的顺序(通过比较器)。

MoviesByRating 当然也可以用同样的方法。

P.S。我注意到我错误地认为 class 被称为电影而不是电影。在我看来,'Movie' 更好,因为单个实例代表一部电影。 (比较:它是整数而不是整数)。