第2节 学生选课——判断Set中课程是否存在
Set中要同时满足hashCode()和equals(obj)两种方法,才能判断存在。(两种方法需要重写)
package com.imooc.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class SetTest {
/**
* @param args
*/
public List<Course> coursesToSelect;
private Scanner scanner;
public Student student;
public SetTest(){
this.coursesToSelect=new ArrayList<Course>();
scanner=new Scanner(System.in);
}
public void testAdd(){
Course cr1=new Course("1","数据结构");
coursesToSelect.add(cr1);
// Course temp=(Course)coursesToSelect.get(0);//对象存入集合都变成Object类型,取出时需要类型转换
// System.out.println("添加了课程"+temp.id+":"+temp.name);
Course cr2=new Course("2","C语言");
coursesToSelect.add(0,cr2);
// Course temp1=(Course)coursesToSelect.get(0);
// System.out.println("添加了课程"+temp1.id+":"+temp1.name);
// coursesToSelect.add(cr1);
// Course temp6=(Course)coursesToSelect.get(2);//对象存入集合都变成Object类型,取出时需要类型转换
// System.out.println("添加了课程"+temp6.id+":"+temp6.name);
//以下方法会抛出数组小标越界异常
//Course cr3=new Course("3","计算机网络");
//coursesToSelect.add(4,cr3);//目前数组长度为2,只能访问位置0、1,不能访问位置3
Course[] course={new Course("3","离散数学"),new Course("4","汇编语言")};
coursesToSelect.addAll(Arrays.asList(course));//将数组转换成List
// Course temp2=(Course)coursesToSelect.get(3);
// Course temp3=(Course)coursesToSelect.get(4);
// System.out.println("添加了课程"+temp2.id+":"+temp2.name);
// System.out.println("添加了课程"+temp3.id+":"+temp3.name);
Course[] course1={new Course("5","高等数学"),new Course("6","大学英语")};
coursesToSelect.addAll(2,Arrays.asList(course1));
// Course temp4=(Course)coursesToSelect.get(2);
// Course temp5=(Course)coursesToSelect.get(3);
// System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
// System.out.println("添加了课程"+temp4.id+":"+temp4.name);
// System.out.println("添加了课程"+temp5.id+":"+temp5.name);
}
public void testForEach(){
System.out.println("有如下课程待选(通过foreach遍历):");
for(Object obj:coursesToSelect){ //先定义一个变量,然后是所要遍历的集合
Course cr=(Course)obj; //当一个对象存入的时候,类型是忽略的;取出的时候往往需要强制转换
System.out.println("课程"+cr.id+":"+cr.name);
}
}
public void testForEachForSet(Student student){
System.out.println("共选择了"+student.courses.size()+"门课程");
for(Course cr:student.courses){
//打印输出,学生所选的课程
System.out.println("课程"+cr.id+":"+cr.name);
}
}
public void createStudentandSelectCours(){
student=new Student("1","小明");
System.out.println("欢迎学生"+student.name+"来选课!");
//创建一个Scanner对象,用来接收从键盘输入的课程ID
Scanner console=new Scanner(System.in);
for(int i=0;i<3;i++){
System.out.println("请输入课程ID");
String courseID=console.next();
for(Course cr:coursesToSelect){
if(cr.id.equals(courseID)){
student.courses.add(cr);
student.courses.add(cr);//测试重复课程(Set集是不可重复的)
//Set中,添加某个对象,无论添加多少次,最终只会保留一个该对象
//并且保留的是第一次添加的那一个
}
}
}
//打印输出,学生所选的课程
testForEachForSet(student);
}
//测试List的contains方法
public void testListContains(){
//取得备选课程序列的第0个元素
Course course=coursesToSelect.get(0);
System.out.println("取得课程"+course.name);
System.out.println("备选课程中是否包含课程:"+course.name+","+coursesToSelect.contains(course));
//创建一个新的课程对象(与course拥有相同id和名称,但是对象不同)
Course course2=new Course(course.id,course.name);
System.out.println("新创建课程"+course2.name);
System.out.println("备选课程中是否包含课程:"+course2.name+","+coursesToSelect.contains(course2));
//有时只知道课程名称,通过名称判断是否包含这门课程,
//可通过for循环遍历名称,但是比较麻烦
//依然可以通过contains判断是否包含这门课程,重写equals方法即可。
}
//测试Set的contains方法
public void testSetContains(){
System.out.println("请输入学生已选的课程名称:");
String name=scanner.next();
//创建一个新的课程对象
Course course=new Course();
course.name=name;
System.out.println("新创建课程:"+course.name);
System.out.println("备选课程中是否包含课程"+course.name+","+student.courses.contains(course));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SetTest st=new SetTest();
st.testAdd();
st.testForEach();
st.createStudentandSelectCours();
// st.testListContains();
st.testSetContains();
}
}
自动生成重写(勾选name+勾选使用instanceof比较类型)
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Course))
return false;
Course other = (Course) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}