所以我有一個HashMap看起來像這樣:HashMap的新功能:我如何對它進行排序?
HashMap<Movie, Float> movies;
它包含了一些電影與他們的全球評級作爲floats
,我想從最好到最差的電影進行排序。
我在Collections.sort()
看看,但不知道如果我可以用它做什麼...
所以我有一個HashMap看起來像這樣:HashMap的新功能:我如何對它進行排序?
HashMap<Movie, Float> movies;
它包含了一些電影與他們的全球評級作爲floats
,我想從最好到最差的電影進行排序。
我在Collections.sort()
看看,但不知道如果我可以用它做什麼...
這是不可能的排序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
,如示例中所示。
默認情況下,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();
}
});
的HashMap是不是你想要達到什麼數據結構。你可以閱讀更多關於HashMap在這裏例如: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html
我建議你的東西是包括你的評級,在你的電影對象,並作出一個可以比較你的電影對象基於評級的Comperator。將電影放置在ArrayList中,然後您可以使用comperator和Collections.sort對其進行分類
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
}
}
您可以從一開始就使用TreeMap。這是一個有序的地圖,你只需要定義一個比較器(在這種情況下,使用你的浮動)
如果你想堅持HashMaps,是的,你可以使用Collections.sort。但是,你仍然需要學習如何使用比較器。
雖然這是一個很好的解決方案,但我認爲如果在這種情況下使用Comperator而不是Compareable,則代碼更易於閱讀。當我閱讀Collections.sort(列表)時,我經常會假定它的標題或類似的排序,而不是評級,但如果我改爲閱讀Collections.sort(list,new Movie.RatingComperator()),我可以馬上看到它按照評分排序,而不是別的。 – Vegard 2013-05-04 18:42:06
我更新了我的示例以包含您的建議。 – 2013-05-04 19:01:13