所以我有一个看起来像这样的HashMap:
HashMap<Movie, Float> movies;
它包含一些全球评分为floats
的电影,我希望将电影从最佳到最差分类。
我看了Collections.sort()
,但不知道我是否可以用它做点什么......
答案 0 :(得分:3)
无法对HashMap进行排序。如果您需要有序地图,请查看TreeMap
。
如何将评分值添加到Movie
课程并让其实施Comparable
?
public class Movie implements Comparable<Movie> {
private Float rating;
public Movie(Float rating) {
this.rating = rating;
}
public Float getRating() {
return rating;
}
public int compareTo(Movie param) {
return param.getRating().compareTo(rating);
}
@Override
public String toString() {
return String.valueOf(rating);
}
}
然后你可以像这样使用你的Movie
课程:
public static void main(String[] args) {
Set<Movie> movies = new HashSet<Movie>();
movies.add(new Movie(0.6f));
movies.add(new Movie(0.5f));
movies.add(new Movie(0.7f));
movies.add(new Movie(0.2f));
// Movie.class has to implement Comparable
System.out.println("First option:");
List<Movie> list = new ArrayList<Movie>(movies);
Collections.sort(list);
printMovies(list);
// Works without implementing Comparable in Movie.class
System.out.println("\nSecond option:");
List<Movie> secondList = new ArrayList<Movie>(movies);
Collections.sort(secondList, new Comparator<Movie>() {
public int compare(Movie movie1, Movie movie2) {
return movie2.getRating().compareTo(movie1.getRating());
}
});
printMovies(secondList);
}
private static void printMovies(List<Movie> list) {
for (Movie movie : list) {
System.out.println(movie);
}
}
输出:
First option:
0.7
0.6
0.5
0.2
Second option:
0.7
0.6
0.5
0.2
如果您总是想以相同的方式(从最好到更差)对电影进行排序,我会选择第一个选项。如果您总是需要不同的排序算法,我会选择第二个选项,但即使您的Movie
类实现Comparable
,您也可以提供不同的Comparator
,如示例所示。
答案 1 :(得分:2)
HashMap不是您想要实现的数据结构。你可以在这里阅读更多关于HashMap的信息: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html
我建议您在Movie对象中包含您的评级,并制作一个可以根据评级比较您的Movie对象的Comperator。将Movie添加到ArrayList中,然后可以使用comperator和Collections.sort对其进行排序
答案 2 :(得分:2)
public class Testing {
public static void main(String[] args) {
HashMap<String,Double> map = new HashMap<String,Double>();
ValueComparator bvc = new ValueComparator(map);
TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);
map.put("A",99.5);
map.put("B",67.4);
map.put("C",67.4);
map.put("D",67.3);
System.out.println("unsorted map: "+map);
sorted_map.putAll(map);
System.out.println("results: "+sorted_map);
}
}
class ValueComparator implements Comparator<String> {
Map<String, Double> base;
public ValueComparator(Map<String, Double> base) {
this.base = base;
}
// Note: this comparator imposes orderings that are inconsistent with equals.
public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return -1;
} else {
return 1;
} // returning 0 would merge keys
}
}
答案 3 :(得分:2)
答案 4 :(得分:2)
您可以从一开始就使用TreeMap。这是一个有序的地图,你只需要定义一个比较器(在这种情况下,使用你的花车)
如果你想坚持使用HashMaps,是的,你可以使用Collections.sort。但同样,你仍然需要学习如何使用比较器。
答案 5 :(得分:1)
默认情况下,HashMaps未排序。如果您需要订购,请使用TreeMap
或只是排序到List<Movie>
List<Movie> movies = new ArrayList<Movie>();
Collections.sort(movies, new Comparator<Movie>() {
public int compare(Movie m1, Movie m2) {
return m1.getRating() - m2.getRating();
}
});