求大牛帮忙解决一个课本的例题,源代码却有错误

Ksly_Tkol 2013-01-05 03:41:59
题目:有一个音像店出租电影业务,需要编写一个应用程序进行管理,在进行出租时能够很快找到顾客需要的电影。例如,在实际应用中,可能会通过以下方式查找需要的电影:
通过标题(title)查找电影
可将电影分成不同的类型(type),如喜剧片、战斗片等。因此在进行出租时,可在某一特定的类型中查找电影;
查找包括某一演员(actor/actress)的电影

代码:
电影类Moive:
import java.util.*; 
public class Movie {
private String title,type;
private Vector<String>actors;
public String getTitle(){
return title;
}
public String getType(){
return type;
}
public Vector<String>getActors(){
return actors;
}
public void setTitle(String aTitle){
title=aTitle;
}
public void setType(String aType){
type=aType;
}
public Movie(){
this("???","???");
}
public Movie(String aTitle,String aType){
title=aTitle;
type=aType;
actors=new Vector<String>();
}
@Override
public String toString(){
return ("Movie:"+"\""+title+"\"");
}
public void addActor(String anActor){
actors.add(anActor);
}
}


MovieStore类:
import java.util.*;

public class MovieStore {
private Hashtable movieList, actorList, typeList;

public Hashtable getMovieList() {
return movieList;
}

public Hashtable getActorList() {
return actorList;
}

public Hashtable getTypeList() {
return typeList;
}

public MovieStore() {
movieList = new Hashtable();
actorList = new Hashtable();
typeList = new Hashtable();
}

public String toString() {
return ("MovieStore with" + movieList.size() + "movies.");
}

public void addMovie(Movie aMovie) {
movieList.put(aMovie.getTitle(), aMovie);
if (!typeList.containsKey(aMovie.getType())) {
typeList.put(aMovie.getType(), new Vector<Movie>());
}
((Vector<Movie>) typeList.get(aMovie.getType())).add(aMovie);
for (String anActor : aMovie.getActors()) {
if (!actorList.containsKey(anActor)) {
actorList.put(anActor, new Vector<Movie>());
}
((Vector<Movie>) actorList.get(anActor)).add(aMovie);
}
}

public void removeMovie(Movie aMovie) {
movieList.remove(aMovie.getTitle());
((Hashtable) typeList.get(aMovie.getType())).remove(aMovie);
if (!((Hashtable) typeList.get(aMovie.getType())).isEmpty()) {
typeList.remove(aMovie.getType());
}
for (String anActor : aMovie.getActors()) {
((Vector<Movie>) actorList.get(anActor)).removeElement(aMovie);
if (!((Hashtable) actorList.get(anActor)).isEmpty()) {
actorList.remove(anActor);
}
}
}

public void removeMovie(String aTitle){
if(movieList.get(aTitle)==null){
System.out.println("No movie with that title");
}else{
removeMovie((Movie) movieList.get(aTitle));
}
}

private void removeMovie(Vector<Movie> vector) {
// TODO Auto-generated method stub

}

public void listMovies(){
Enumeration<String>titles=movieList.keys();
while(titles.hasMoreElements()){
System.out.println(titles.nextElement());
}
}

public void listMoviesWithActor(String anActor){
Iterator<Movie>someMovies=((AbstractList<Movie>) actorList.get(anActor)).iterator();
while(someMovies.hasNext()){
System.out.println(someMovies.next());
}
}

public void listMoviesOfType(String aType){
Vector<Movie>someMovies=(Vector<Movie>) typeList.get(aType);
for(Movie m:someMovies){
System.out.println(m);
}
}
}


测试类:

public class MovieStoreTester {
public static void main(String args[]){
MovieStore aStore=new MovieStore();
Movie aMovie=new Movie("白毛女","悲剧片");
aMovie.addActor("田华");
aMovie.addActor("李百万");
aMovie.addActor("陈强");
aStore.addMovie(aMovie);

aMovie=new Movie("党的女儿","教育片");
aMovie.addActor("田华");
aMovie.addActor("陈戈");
aStore.addMovie(aMovie);

aMovie=new Movie("红色娘子军","教育片");
aMovie.addActor("祝希娟");
aMovie.addActor("王心刚");
aMovie.addActor("陈强");
aStore.addMovie(aMovie);

aMovie=new Movie("五朵金花","爱情片");
aMovie.addActor("陈丽坤");
aMovie.addActor("赵丹");
aStore.addMovie(aMovie);

aMovie=new Movie("上甘岭","战斗片");
aMovie.addActor("陈强");
aMovie.addActor("高宝成");
aStore.addMovie(aMovie);

aMovie=new Movie("马路天使","喜剧片");
aMovie.addActor("赵丹");
aMovie.addActor("周璇");
aStore.addMovie(aMovie);

aMovie=new Movie("少林寺","武打片");
aMovie.addActor("葛优");
aStore.addMovie(aMovie);

aMovie=new Movie("我的父亲母亲","爱情片");
aMovie.addActor("章子怡");
aMovie.addActor("孙红雷");
aStore.addMovie(aMovie);

aMovie=new Movie("红高粱","艺术片");
aMovie.addActor("巩俐");
aMovie.addActor("姜文");
aStore.addMovie(aMovie);

System.out.println("Here are the movies in :"+aStore);
System.out.println("删除白毛女");
aStore.removeMovie("白毛女");
System.out.println("删除秋菊打官司");
aStore.removeMovie("秋菊打官司");

System.out.println("\n教育片");
aStore.listMoviesOfType("教育片");
System.out.println("\n爱情片");
aStore.listMoviesOfType("爱情片");

System.out.println("\n陈强的电影::");
aStore.listMoviesWithActor("陈强");
System.out.println("\n赵丹的电影::");
aStore.listMoviesWithActor("赵丹");
}
}



错误在于MovieStore中的removeMovie方法!
...全文
447 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc41106 2013-01-05
  • 打赏
  • 举报
回复
	public void removeMovie(Movie aMovie) {
		movieList.remove(aMovie.getTitle());
		((Vector<Movie>) typeList.get(aMovie.getType())).remove(aMovie);//下面只要不是空都删了,剩下的都是空,还要这句干啥使?
		if (!((Vector<Movie>)typeList.get(aMovie.getType())).isEmpty()) {//!isEmpty()就是不为空的时候移除。也就是我删除"白毛女"的时候就得删除"悲剧片"?合理么?
			typeList.remove(aMovie.getType());
		}
		for (String anActor : aMovie.getActors()) {
			((Vector<Movie>) actorList.get(anActor)).removeElement(aMovie);//
			if (!((Vector<Movie>) actorList.get(anActor)).isEmpty()) {//同理,删除"白毛女"的时候就得删除"陈强"?合理么?
				actorList.remove(anActor);
			}
		}
	}
唉,居然让我百度。。。。 太桑心了。。。 好歹也要说google啊。。。。
abc41106 2013-01-05
  • 打赏
  • 举报
回复
引用 4 楼 Ksly_Tkol 的回复:
引用 3 楼 abc41106 的回复:typeList.get获取到的是Vector<Movie>,所以强转类型应该是Vector<Movie> Java code?12345678910111213public void removeMovie(Movie aMovie) { movieList.remove(aMovie.getTitle()); ((……
。。。我知道啊。。。 我的意思就是没有值的时候才把这个项删掉啊。。。要不然不是把别人的给删了?。。。。。
  • 打赏
  • 举报
回复
引用 3 楼 abc41106 的回复:
typeList.get获取到的是Vector<Movie>,所以强转类型应该是Vector<Movie> Java code?12345678910111213public void removeMovie(Movie aMovie) { movieList.remove(aMovie.getTitle()); ((Vector<Movie>) typeL……
百度一下吧 isEmpty()没有值的时候才返回true
abc41106 2013-01-05
  • 打赏
  • 举报
回复
typeList.get获取到的是Vector<Movie>,所以强转类型应该是Vector<Movie>
	public void removeMovie(Movie aMovie) {
		movieList.remove(aMovie.getTitle());
		((Vector<Movie>) typeList.get(aMovie.getType())).remove(aMovie);//
		if (!((Vector<Movie>)typeList.get(aMovie.getType())).isEmpty()) {//为什么我觉得这里应该是isEmpty()而不应该是!isEmpty()呢
			typeList.remove(aMovie.getType());
		}
		for (String anActor : aMovie.getActors()) {
			((Vector<Movie>) actorList.get(anActor)).removeElement(aMovie);//
			if (!((Vector<Movie>) actorList.get(anActor)).isEmpty()) {//为什么我觉得这里应该是isEmpty()而不应该是!isEmpty()呢
				actorList.remove(anActor);
			}
		}
	}
xingfuzhuzi1314 2013-01-05
  • 打赏
  • 举报
回复

package com.test;

import java.util.AbstractList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;

public class MovieStore {
	private Hashtable movieList, actorList, typeList;

	public Hashtable getMovieList() {
		return movieList;
	}

	public Hashtable getActorList() {
		return actorList;
	}

	public Hashtable getTypeList() {
		return typeList;
	}

	public MovieStore() {
		movieList = new Hashtable();
		actorList = new Hashtable();
		typeList = new Hashtable();
	}

	public String toString() {
		return ("MovieStore with" + movieList.size() + "movies.");
	}

	public void addMovie(Movie aMovie) {
		movieList.put(aMovie.getTitle(), aMovie);
		if (!typeList.containsKey(aMovie.getType())) {
			typeList.put(aMovie.getType(), new Vector<Movie>());
		}
		((Vector<Movie>) typeList.get(aMovie.getType())).add(aMovie);
		for (String anActor : aMovie.getActors()) {
			if (!actorList.containsKey(anActor)) {
				actorList.put(anActor, new Vector<Movie>());
			}
			((Vector<Movie>) actorList.get(anActor)).add(aMovie);
		}
	}

	public void removeMovie(Movie aMovie) {
		movieList.remove(aMovie.getTitle());
		((Vector) typeList.get(aMovie.getType())).remove(aMovie);
		if (!((Vector) typeList.get(aMovie.getType())).isEmpty()) {
			typeList.remove(aMovie.getType());
		}
		for (String anActor : aMovie.getActors()) {
			((Vector<Movie>) actorList.get(anActor)).removeElement(aMovie);
			if (!((Vector) actorList.get(anActor)).isEmpty()) {
				actorList.remove(anActor);
			}
		}
	}
	
	public void removeMovie(String aTitle){
		if(movieList.get(aTitle)==null){
			System.out.println("No movie with that title");
		}else{
			removeMovie((Movie) movieList.get(aTitle));
		}
	}

	private void removeMovie(Vector<Movie> vector) {
		// TODO Auto-generated method stub
		
	}

	public void listMovies(){
		Enumeration<String>titles=movieList.keys();
		while(titles.hasMoreElements()){
			System.out.println(titles.nextElement());
		}
	}
	
	public void listMoviesWithActor(String anActor){
		if(actorList.get(anActor)!=null){
			Iterator<Movie>someMovies=((AbstractList<Movie>) actorList.get(anActor)).iterator();
			while(someMovies.hasNext()){
				System.out.println(someMovies.next());
			}
		}
		
	}
	
	public void listMoviesOfType(String aType){
		Vector<Movie>someMovies=(Vector<Movie>) typeList.get(aType);
		for(Movie m:someMovies){
			System.out.println(m);
		}
	}
}

LZ,修改后的类。 遇到错误,你可以自己用debug as进行调试,一共有2个错误。 第一个是把vector强制转换成了hashTable,
public void removeMovie(Movie aMovie) {
		movieList.remove(aMovie.getTitle());
		((Vector) typeList.get(aMovie.getType())).remove(aMovie);
		if (!((Vector) typeList.get(aMovie.getType())).isEmpty()) {
			typeList.remove(aMovie.getType());
		}
		for (String anActor : aMovie.getActors()) {
			((Vector<Movie>) actorList.get(anActor)).removeElement(aMovie);
			if (!((Vector) actorList.get(anActor)).isEmpty()) {
				actorList.remove(anActor);
			}
		}
	}
这个里面, 还有一个,就是在你删除陈强这个的时候,由于对应的白毛女和教育片上面已经删除, 之后获取他对应的电影的时候,为空,可你对于空进行了迭代,导致空指针异常。

public void listMoviesWithActor(String anActor){
		if(actorList.get(anActor)!=null){
			Iterator<Movie>someMovies=((AbstractList<Movie>) actorList.get(anActor)).iterator();
			while(someMovies.hasNext()){
				System.out.println(someMovies.next());
			}
		}
		
	}
笑莫问 2013-01-05
  • 打赏
  • 举报
回复
报错了就贴异常

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧