3

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

像这样:

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

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

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

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

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

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

4

8 回答 8

4

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

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

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

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

于 2012-04-25T15:01:03.943 回答
3

你可以使用类似的东西:

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

您需要覆盖该方法equals

于 2012-04-25T15:01:46.153 回答
3

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

所以作为一个起点,你的addGrade方法的第一行可能看起来像

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

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

于 2012-04-25T15:02:03.533 回答
2

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

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

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

于 2012-04-25T15:03:15.670 回答
2

你做得很好!但你应该考虑几件事:

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

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

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

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

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

于 2012-04-25T15:07:18.057 回答
2

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

private Multimap<Movie, Grade> map = ArrayListMultimap.create();

public void addGrade(Movie movie, Grade grade){
   map.put(movie, grade);
}

它将负责为您创建列表。

于 2012-04-25T15:30:56.047 回答
1
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));
}
}
于 2012-04-25T15:02:14.220 回答
1
gradedMovies.containsKey(movie);

    for(Map.Entry<Movie,List<Grades>> entry : gradedMovies.entrySet()){
            Movie key = entry.getKey();
       }
于 2012-04-25T15:02:25.733 回答