【问题标题】:Collection sort that sort based on class that implements Comparator基于实现 Comparator 的类进行排序的集合排序
【发布时间】:2020-03-19 16:31:57
【问题描述】:

我对集合排序有疑问,具体来说

Output:
[B_Author: Movie_X, A_Author: Movie_A, A_Author: Movie_B]
Should Be:
[A_Author: Movie_A, A_Author: Movie_B, B_Author: Movie_X]

应该这样做的方法(在 MovieStorage 类中):

public Set<Movie> getCatalogue(Comparator<Movie> comp){
        List<Movie> sett = new ArrayList<>(this.movieList);
        sett.sort(comp);
        return new HashSet<>(sett);
    }

实现比较器的类:

public class MovieComparator implements Comparator<Movie>
{
    @Override
    public int compare(Movie a, Movie b) {
        if (a.getName().compareTo(b.getName()) == 0){
            return a.getAuthor().compareTo(b.getAuthor());
        }
        return a.getName().compareTo(b.getName());
    }
}

调用方法:

System.out.println(movieStorage.getCatalogue(new MovieComparator()));

我一直在查看 StackOverflow 和其他网站,但我注意到每个人都根据 1 个参数对其进行排序(这对我也不起作用),同时代码与我的几乎相同。 ..

提前感谢您的帮助:)

【问题讨论】:

  • HashSet 的文档对订购有何规定?
  • 表示HashSet不维护其元素的顺序。因此 HashSet 的排序是不可能的。 ....这意味着我无法将其转换回设置...我真是个 bakaroo ...谢谢...您可以将其发布为答案,我会投票+检查是否正确
  • 您还可以使用更 i18n 的比较,使用整理器而不是字符的二进制比较。 ÉÈÊEéèêe 使用您的“按字母顺序”排序方法可能不会很接近。
  • 还有其他类型的集合保留插入顺序。以 Linkedhashset 为例。

标签: java compare comparator comparable compareto


【解决方案1】:

创建比较器的更紧凑的方法:

Comparator<Movie> comparator =
    Comparator.comparing(Movie::getName).thenComparing(Movie::getAuthor);

Set<Movie> movies = new TreeSet<>(comparator);
movies.addAll(movieList);

并且TreeSet 按排序顺序迭代。

添加到Movie 类:

public static class Movie implements Comparable<Movie> {
    private static final Comparator<Movie> COMPARATOR =
        Comparator.comparing(Movie::getName).thenComparing(Movie::getAuthor);

    ...

    @Override
    public int compareTo(Movie other) {
        return COMPARATOR.compare(this, other);
    }
}

那么TreeSet 不需要指定比较器:

Set<Movie> movies = new TreeSet<>(movieList);

【讨论】:

  • 你打败了我!我正要发表最后一条评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2011-07-20
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多