【问题标题】:Obtain the higher number of repetitions in an ArrayList在 ArrayList 中获得更多的重复次数
【发布时间】:2013-05-20 17:58:51
【问题描述】:

我有以下结构:

ArrayList<ArrayList<Movies>>

而且电影有重复,我需要获得重复次数较多的 n 部电影。我一直在努力思考这个问题,但我想不出任何优雅的解决方案。

【问题讨论】:

  • 使用自定义比较器对列表进行排序。
  • 您认为哪些解决方案不优雅?
  • 我想制作一个所有电影的数组而不重复,并创建一个比较器,通过它们在另一个数组中的频率来比较独特电影数组中的电影

标签: java oop arraylist


【解决方案1】:

改成下面这样

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

确保您已正确实施 hashcodeequals 以使其正常工作

【讨论】:

  • 我将使用 TreeMap 而不是 HashMap。非常感谢!
  • TreeMap 本身并不是轻松排序(至少不是按值排序)。 TreeMap 按 Key 排序。因此,在使用 Map 方法添加所有元素后,您需要按值排序作为单独的传递
【解决方案2】:

你可以使用

   Map<Movie,Integer> 

保留

<movie,frequency>

您可以在 Map 中搜索,甚至可以使用基于频率排序的 TreeMap,您可以直接从中获取前 N 个元素。

【讨论】:

  • 我如何要求更多重复的 n 部电影。例如,我需要知道频率较高的 5 部电影
【解决方案3】:

现在是使用地图的好时机。键是电影,值是整数。之后您可以创建一个新的 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 sort by value,或者您可以创建一个自定义类,它是一个电影和计数器,并将其放入带有自定义比较器的列表中。

【讨论】:

  • 对不起,为什么投反对票?答案是正确的,并且它还包含有关事后对地图进行排序以获得前 n 个元素的信息,这很重要,因为地图本身并没有这样做
猜你喜欢
  • 2023-01-12
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2019-04-02
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多