0

所以我有一个看起来像这样的 HashMap:

HashMap<Movie, Float> movies;

它包含一些全球评分为floats的电影,我想将电影从最好到最差排序。

我看了看,Collections.sort()但不知道我是否可以用它做点什么......

4

6 回答 6

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如示例中所示。

于 2013-05-04T17:57:02.523 回答
2

HashMap 不是您想要实现的数据结构。您可以在此处阅读有关 HashMap 的更多信息,例如:http: //docs.oracle.com/javase/1.5.0/docs/api/java/util/HashMap.html

我建议您将您的评分包含在您的 Movie 对象中,并制作一个 Comperator 可以根据评分比较您的 Movie 对象。将电影放在 ArrayList 中,然后您可以使用比较器和 Collections.sort 对其进行排序

于 2013-05-04T17:58:30.507 回答
2

使用TreeMap。从此如此回答

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
    }
}
于 2013-05-04T17:59:58.003 回答
2

您可以使用Guava 库来执行此操作 -这里已经有一个很好的答案来解释如何执行此操作

于 2013-05-04T18:01:45.970 回答
2

您可以从一开始就使用 TreeMap。这是一个排序的地图,你只需要定义一个比较器(在这种情况下,使用你的浮点数)

如果你想坚持使用 HashMaps,是的,你可以使用 Collections.sort。但同样,您仍然必须学习如何使用比较器。

于 2013-05-04T18:02:37.023 回答
1

默认情况下,HashMap 是未排序的。如果您需要订购,请使用 aTreeMap或简单地分类为 aList<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();
        }
});
于 2013-05-04T17:57:12.347 回答