我正在使用HashMap,其中我使用ArrayList作为值。
像这样:
Map<Movie, List<Grades>> gradedMovies = new HashMap();
我正在尝试创建一个方法,我可以使用该方法迭代值以查看键(电影)是否已存在。如果是,我想在分配给特定键(电影)的列表中添加新值(等级)。像这样:
public void addGrade(Movie movie, Grade grade) {
// stuff here }
最终我无法打印一张可以显示电影及其电影的地图。等级被添加到地图后。
这是如何实现的?或者我的整个方法(使用地图)是完全错误的?
感谢您的帮助。 (这是作业)
答案 0 :(得分:3)
我认为你是在正确的道路上,只要确保你的电影对象实现equals
和hashCode
,这样它就可以作为哈希映射的真正关键。
如果你想要漂亮的打印,只需实现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()方法)。对于每部电影,您都以类似的方式打印成绩列表。
我不知道您是否熟悉字符串打印,但可以在字符串中添加一些特殊的字符组合,以便为其提供某种格式。例如:
希望这有助于消除一些疑虑。祝你好运!。
答案 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();
}