2013-05-04 111 views
0

所以我有一個HashMap看起來像這樣:HashMap的新功能:我如何對它進行排序?

HashMap<Movie, Float> movies; 

它包含了一些電影與他們的全球評級作爲floats,我想從最好到最差的電影進行排序。

我在Collections.sort()看看,但不知道如果我可以用它做什麼...

回答

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

雖然這是一個很好的解決方案,但我認爲如果在這種情況下使用Comperator而不是Compareable,則代碼更易於閱讀。當我閱讀Collections.sort(列表)時,我經常會假定它的標題或類似的排序,而不是評級,但如果我改爲閱讀Collections.sort(list,new Movie.RatingComperator()),我可以馬上看到它按照評分排序,而不是別的。 – Vegard 2013-05-04 18:42:06

+0

我更新了我的示例以包含您的建議。 – 2013-05-04 19:01:13

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(); 
     } 
}); 
2

的HashMap是不是你想要達到什麼數據結構。你可以閱讀更多關於HashMap在這裏例如: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html

我建議你的東西是包括你的評級,在你的電影對象,並作出一個可以比較你的電影對象基於評級的Comperator。將電影放置在ArrayList中,然後您可以使用comperator和Collections.sort對其進行分類

2

使用TreeMap。從這個so answer

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 
    } 
} 
2

您可以從一開始就使用TreeMap。這是一個有序的地圖,你只需要定義一個比較器(在這種情況下,使用你的浮動)

如果你想堅持HashMaps,是的,你可以使用Collections.sort。但是,你仍然需要學習如何使用比較器。

相關問題