【问题标题】:Using a list inside a map (Java)在地图中使用列表(Java)
【发布时间】:2012-05-06 06:59:24
【问题描述】:

我正在使用 HashMap,其中我使用 ArrayList 作为值。

像这样:

Map<Movie, List<Grades>> gradedMovies = new HashMap();

我正在尝试创建一种方法,我可以使用该方法遍历值以查看键(电影)是否已经存在。如果是这样,我想在分配给特定键(电影)的列表中添加一个新值(等级)。像这样的:

public void addGrade(Movie movie, Grade grade) {
// stuff here }

最终,我无法打印一张地图,该地图会在电影添加到地图后显示电影及其等级。

这是如何实现的?还是我的整个方法(使用地图)完全错误?

感谢您的帮助。 (这是作业)

【问题讨论】:

  • 我所看到的方法没有任何问题。你具体是在坚持什么?
  • 我不知道如何为特定电影添加评分,因为 HashMaps(我刚刚意识到)似乎没有索引。
  • 如果这是家庭作业,我建议您提供一些我们可以查看的代码并提出改进建议,而不是仅仅要求我们为您提供解决方案。
  • @Mark 你有containsKey(&lt;key&gt;) 来查看键是否存在,get(&lt;key&gt;) 来获取你不需要索引的键的值。

标签: java list map


【解决方案1】:

我认为您走在正确的道路上,只需确保您的电影对象实现 equalshashCode,这样它就可以作为哈希映射的真正键。

如果你想要漂亮的打印,只需实现 toString 方法。

public void addGrade(Movie movie, Grade grade) {
    if (!gradedMovies.containsKey(movie)) { 
        gradedMovies.put(movie, new ArrayList()); 
    }
    gradedMovies.get(movie).add(grade);
}

希望这会有所帮助,干杯!

【讨论】:

【解决方案2】:

你可以使用类似的东西:

public void addGrade(Movie movie, Grade grade) {
    if (!gradedMovies.containsKey(movie)) {
        gradedMovies.put(movie, new ArrayList<Grade>());
    }
    gradedMovies.get(movie).add(grade);
}

你需要重写方法equals

【讨论】:

    【解决方案3】:

    我不知道您为什么要特别寻找索引 - Map要点是您可以通过它们的键查找条目。

    因此,作为起点,addGrade 方法的第一行可能如下所示

    List<grades> grades = gradedMovies.get(movie);
    

    你可以从那里得到它。 (记得查看documentation,看看如果地图还没有包含给定的电影会发生什么......)

    【讨论】:

    • 好吧,我不太明白如何使用密钥。谢谢。
    【解决方案4】:

    我可以遍历这些值以查看键(电影)是否已经存在

    您无需遍历地图,只需调用gradedMovies.containsKey( movieToCheck )

    请注意,当使用Movie 作为键时,您应该提供equals()hashCode() 的合理实现。

    【讨论】:

      【解决方案5】:

      你做得很好!但您应该考虑以下几点:

      在地图上查找值时,您的 Movie 对象必须覆盖 equals 和 hashChode。 Java 将始终在比较上使用 equals 方法,主要是在涉及自动比较时(例如验证列表是否包含项目,或者在这种情况下,键值是否等于给定值)。 请记住,equals 定义了项目的唯一性,因此您应该根据特定的唯一属性进行比较,例如标识号或(在本例中)它的名称。

      要打印地图,迭代 keySet,可以手动(增强的“for”循环)或使用迭代器(可以直接通过.iterator() 方法)。对于每部电影,您以类似的方式打印成绩列表。

      我不知道你是否熟悉字符串打印,但是可以将一些特殊的字符组合添加到字符串中以赋予它某种格式。例如:

      • \n 将插入换行符
      • \t 是一个表格

      希望这有助于消除一些疑虑。祝你好运!

      【讨论】:

      • @Mark 没问题 :)。我忘了提到,就像电影一样,如果你想确保一个成绩只添加一次到列表中,Grades 也应该实现 equals 和 hashCode。 Equals 允许您使用类似 gradeList.contains(grade) 的调用。
      【解决方案6】:

      查看 Guava 的 Multimap。这正是它的作用。

      private Multimap<Movie, Grade> map = ArrayListMultimap.create();
      
      public void addGrade(Movie movie, Grade grade){
         map.put(movie, grade);
      }
      

      它将负责为您创建列表。

      【讨论】:

        【解决方案7】:
        public void addGrade(Movie movie, Grade grade) {
        
        boolean found = false;
        for(Movie m : gradedMovies.keyset()) {
            // compare the movies
            if(/* match on movies */) {
                gradedMovies.get(m).add(grade);
                found = true;
            }
        }
        if(!found) {
            gradedMovies.put(movie, new ArrayList().add(grade));
        }
        }
        

        【讨论】:

        • 迭代而不是使用 Map.get 有什么意义?这只是更多的代码和更慢。
        【解决方案8】:
        gradedMovies.containsKey(movie);
        
            for(Map.Entry<Movie,List<Grades>> entry : gradedMovies.entrySet()){
                    Movie key = entry.getKey();
               }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-17
          • 1970-01-01
          相关资源
          最近更新 更多