繁体   English   中英

在地图中使用列表(Java)

[英]Using a list inside a map (Java)

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

像这样:

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

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

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

最终我不能打印一张地图,这些地图会在将电影及其成绩添加到地图后显示。

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

谢谢你的帮助。 (这是作业)

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

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

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

希望这有帮助,干杯!

你可以使用这样的东西:

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

您需要覆盖equals方法

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

所以作为一个起点,你的addGrade方法的第一行可能是这样的

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

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

我可以迭代值来查看键(电影)是否已经存在

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

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

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

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

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

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

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

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

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

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

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

它将负责为您创建列表。

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));
}
}
gradedMovies.containsKey(movie);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM