如何修复我的比较字符串与 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' 更好,因为单个实例代表一部电影。 (比较:它是整数而不是整数)。
我编写了这段代码来按名称对电影进行排序,它是一个字符串,但它并没有对它进行排序。
另外,我应该如何根据年份属性比较两个 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' 更好,因为单个实例代表一部电影。 (比较:它是整数而不是整数)。