[英]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 }
最终我不能打印一张地图,这些地图会在将电影及其成绩添加到地图后显示。
这是如何完成的? 或者我的整个方法(使用地图)是完全错误的?
谢谢你的帮助。 (这是作业)
我认为你是在正确的道路上,只要确保你的电影对象实现equals
和hashCode
这样它就可以作为哈希映射的真正关键。
如果你想要漂亮的打印,只需实现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。 对于每部电影,您都以类似的方式打印成绩列表。
我不知道你是否熟悉字符串打印,但是可以在字符串中添加一些特殊的字符组合来为它提供某种格式。 例如:
希望这有助于消除一些疑虑。 祝好运!。
查看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.