在地图中使用列表(Java)

时间:2012-04-25 14:56:29

标签: java list map

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

像这样:

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

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

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

最终我无法打印一张可以显示电影及其电影的地图。等级被添加到地图后。

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

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

8 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:3)

你可以使用类似的东西:

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

您需要覆盖方法equals

答案 2 :(得分:3)

我不知道你为什么要特别寻找索引 - Map是你可以按键查找条目。

因此,作为起点,addGrade方法的第一行可能看起来像

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

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

答案 3 :(得分:2)

  

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

您无需遍历地图,只需致电gradedMovies.containsKey( movieToCheck )

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

答案 4 :(得分:2)

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

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

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

我不知道您是否熟悉字符串打印,但可以在字符串中添加一些特殊的字符组合,以便为其提供某种格式。例如:

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

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

答案 5 :(得分:2)

查看番石榴的Multimap。这正是它的作用。

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

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

它将负责为您创建列表。

答案 6 :(得分: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));
}
}

答案 7 :(得分:1)

gradedMovies.containsKey(movie);

    for(Map.Entry<Movie,List<Grades>> entry : gradedMovies.entrySet()){
            Movie key = entry.getKey();
       }