package gatherBox.exercises.movie;
import java.util.*;
public class Movie {
private String name;//构建一个属性为电影名字,该属性的类型是 private String
private String type;//构建一个属性为电影属性
private Integer donny;//构建一个属性为电影人气
public Movie() {//无参构造器
}
public Movie(String name, String type, Integer donny) {//设置一个有参构造器,提供类的初始化和实例化,以便调用。
// (因为private类型属性不能直接调用,通过构造器来实现调用)
this.name = name;//将获取的 name 赋值给自己的 name (也就是private类型的 name )
this.type = type;//将获取的 type 赋值给自己的 type (也就是private类型的 type )
this.donny = donny;//将获取的 donny 赋值给自己的 donny (也就是private类型的 donny )
}
public String getName() {//name 阅读器,其他类通过getName获取当前类private String name的值
return name;//返回 name
}
public void setName(String name) {//name 修改器,其他类通过setName修改当前类private String name的值(所以返回为void)
this.name = name;//将外部获取的 name 赋值给自己的name
}
public String getType() {//type 阅读器
return type;//返回 type
}
public void setType(String type) {//type 修改器
this.type = type;//将外部获取的 type 赋值给自己的 type
}
public Integer getDonny() {//donny 阅读器
return donny;//返回 donny
}
public void setDonny(Integer donny) {//donny 修改器
this.donny = donny;//将外部获取的 donny 赋值给自己的 donny
}
@Override
public String toString() {//让返回的哈希值变为返回String值
return "电影名称:"+name+"\n电影类型:"+type+"\n电影人气"+donny;
}
}
class MovieManager{
public static void main(String[] args) {
//定义一个容器来存放Movie对象内容
List<Movie> moviesList = new ArrayList<>();
//定义一个HashSet集合,用来封装电影类型
Map<Integer,String> movieTypeMap = new HashMap<>();//容器存放电影类型
int count = 1;//设置一个 int 类型参数
for (;;){//构建一个死循环
System.out.println("*************************************");
System.out.println("\t\t1、添加电影");
System.out.println("\t\t2、查看电影列表");
System.out.println("\t\t3、分类管理");
System.out.println("\t\t4、显示人气最高电影");
System.out.println("\t\t5、退出");
System.out.println("*************************************");
System.out.print("请选择:");
Scanner input = new Scanner(System.in);// System.in -参数,这里就是获取输入流的意思。
int num = input.nextInt();//使用输入流对象调用 nextInt() 方法输入一个整数到 num 中,
// 其意思是使用 Scanner 类中的 nextInt() 方法输入一个整数, 该方法只是接受一个整型的数据,
// 如果输入的是非整数数据, 将会 抛出 InputMismatchException 异常。
switch (num){// switch case 语句,该意思是当num为相应值的时候就执行下面 case 的相应语句
case 1://当 num 为 1 时候执行下面语句
System.out.println("开始添加电影");
System.out.println("请输入添加的电影名称");
String name = input.next();//使用输入流对象调用next()方法输入一个对应的值给 name 中(这里因为没有 类型 制
// 约所以输入的类型可以任意)【说明:上面nextInt()方法的类型为 int 类型】
System.out.println("请输入添加的电影类型");
String type = input.next();//使用输入流对象调用next()方法输入一个对应的值给 type 中
System.out.println("请输入添加的电影人气");
Integer donny = input.nextInt();//使用输入流对象调用next()方法输入一个对应的值给 donny 中
Movie movie = new Movie(name,type,donny);//将电影名称、电影类型、电影人气封装成一个 Movie 对象【注:Movie 是类目的是暂时存放电影信息。该封
// 装用 ArrayList 集合进行的封装保存】
moviesList.add(movie);//将封装好的电影名称、电影类型、电影人气放入 ArrayList 集合
//将电影对象存放到集合中去(HashSet)
boolean b = movieTypeMap.containsValue(type);//将电影属性存放在HashSet中
if (!b) {//判断电影属性是否存在,电影属性不存在才添加(否则会出现重复的电影类型所以需要判断),存在就不添加了
movieTypeMap.put(count, type);//当电影类型不存在添加到movieTypeMap类型里面,count 变量已经初始化为1了,当不存在将count存放在 key
//type 存放在 value
count++;//count 进行自加
}
break;//结束当前 case 语句(如果没有该语句它将继续执行 case 2 直到退出)
case 2 ://case 2 是查看电影列表
moviesList.forEach(temp->{//电影列表是存在 ArrayList 集合中的所有只需要打印 ArrayList 集合就行所以该语句为打印语句
System.out.println(temp+"\n");
});
break;//结束当前case
case 3 ://电影属性分类
System.out.println("请选择分类");
//遍历存放电影类型的map集合
movieTypeMap.forEach((k,v)->{//电影属性是存放在 HashMap 的所以遍历一遍就行
System.out.println(k+"、"+v);
});
Integer movieTypeNum = input.nextInt();//键盘输入具体的电影类型
String movieType = movieTypeMap.get(movieTypeNum);//根据电影编号(key),找出具体的电影类型(value)
//找出相应类型的所有电影,从moviesList查找
for (Movie temp : moviesList){
//去除temp中的电影类型
String tempMovieType = temp.getType();
//比较
if (movieType.equals(tempMovieType)){
System.out.println(temp+"\n");
}
}
break;
case 4://显示人气最高的电影
Movie leiTai=moviesList.get(0);//定义一个比较平台(构建一个比较语句)
//开始比较
for (int n = 1;n<moviesList.size();n++) {
//取出第一个值
Integer i = leiTai.getDonny();
//取出第二个值
Movie m = moviesList.get(n);
Integer j = m.getDonny();
if (i<j) {
leiTai = m;
}
}
//打印最高分电影
System.out.println(leiTai);
break;
case 5:
System.out.println("退出中");
System.exit(0);//因为这里是关闭语句,所以下面 break 有没有都可以,但是为了语句的严谨性尽量还是
//将 break 写出来,以便带来不必要的麻烦
break;
default://default 语句是在 switch 输入的字符没有对应的 case 时候执行的。这里当没有对应的 case 的时候代表
// 输入错误,所以只需要一个打印语句提示退出 default 语句就行。
System.out.println("输入错误,请重新输入!");
break;
}
}
}
}