我有以下结构:
ArrayList<ArrayList<Movies>>
而且电影有重复,我需要获得重复次数较多的 n 部电影。我一直在努力思考这个问题,但我想不出任何优雅的解决方案。
将其更改为以下
HashMap<Movie, Integer> map = new HashMap<Movie, Integer>();
// ArrayList<ArrayList<Movies>> listOfList = ...initialized
for (ArrayList<Movie> list : listOfList)
{
for (Movie movie : list)
{
if (map.containsKey(movie))
{
int count = map.get(movie);
map.put(movie, (count+1));
}
else
{
map.put(movie, 1);
}
}
}
确保您已正确实施hashcode
并equals
使其正常工作
这是使用地图的好时机。键是电影,值是整数。之后,您可以创建一个新的 TreeMap 来获取排序后的值。
ArrayList<ArrayList<Movies>> myMovieList;
Map<Movie,Integer> map = new HashMap<Movie,Integer>();
for (List<Movie> movies : myMovieList) {
for (Movie movie: movies){
Integer count = map.get(movie);
if (count == null){
map.put(movie,1);
} else {
map.put(movie, count+1);
}
}
}
最后,您将获得一个电影列表,现在您可以按值排序。请参阅按值排序树图,按值排序 TreeMap,或者您可以创建一个自定义类,它是一个电影和计数器,并将其放入具有自定义比较器的列表中。
你可以利用
Map<Movie,Integer>
保持
<movie,frequency>
您可以在 Map 中搜索,甚至可以使用基于频率排序的 TreeMap,您可以直接从中获取前 N 个元素。