collection  集合

Collection接口 是List Set和Queue接口的父接口 定义了可用于操作List,Set和Queue的方法---增删改查

Set  HashSet
Set接口及其实现类---HashSet  Set是元素无序并且不可以重复的集合,被称为集
HashSet---哈希集,是Set的一个重要实现类

List--->元素有序,可以重复  Set--->元素无序,不可以重复

set循环用foreach,iterator   list集合用get()方法

课程类Course如下所示:

/**
 * 课程类
 */
 public class Course
 {
     public String id;
     public String name;
     public Course(String id,String name){
       this.id   = id;
       this.name = name;
     }
     //添加一个无参构造器
     public Course() {
     
     }
     //重新equals函数,这个写了一部分不再写了
     /*@Override
     public boolean equals(Object obj) {
        if(this == obj) {
           return true;
        }
        if(obj == null) 
            return false;
        return true;
     }
     */
 }

学生类Student如下所示:

import java.util.Set;
 import java.util.HashSet;
 /**
 * 学生类
 */
 //public class Student
 public class Student implements Comparable<Student> {    public String id;
     public String name;
     //public Set courses;//课程信息的属性,以前这样的实例
     public Set<Course>courses;//课程信息的属性    public Student(String id,String name){ //构造器
       this.id   = id;
       this.name = name;
       //this.courses = new HashSet();//以前这样写
       this.courses = new HashSet<Course>();
     }//Student end    @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 Student))
            return false;
        Student other = (Student)obj;
        if(name == null) {
          if(other.name != null) 
             return false;
        }else if(!name.equals(other.name))
            return false;
        return true;
     }
     @Override
     public int compareTo(Student o) {
        return this.id.compareTo(o.id);
     }//compareTo end
 }//Student end

Set的测试类SetTest如下所示:

import java.util.ArrayList;
 import java.util.List;
 import java.util.Scanner; public class SetTest
 {
     public List<Course> coursesToSelect;
     private Scanner console;
     public Student student;
     public SetTest() {
       coursesToSelect = new ArrayList<Course>();
       console = new Scanner(System.in);
     }//SetTest end    public void testAdd() {
      Course cr2 = new Course("2","C语言");
       coursesToSelect.add(0,cr2);
       Course temp2 = (Course)coursesToSelect.get(0);
       //System.out.println("添加了课程:"+temp2.id+":"+temp2.name);
     }
     /*
      * 通过for each方法访问集合元素
      * @param args
     */
     public void testForEach() {
        System.out.println("有如下课程待选(通过for each访问):");
        for(Object obj:coursesToSelect) {
           Course cr = (Course)obj;
           System.out.println("课程:"+cr.id+":"+cr.name);
        }
     }
    /*
      * 测试List的contains方法
     */
     public void testListContains() {
        //取得备选课程序列的第0个元素
        Course course = coursesToSelect.get(0);
        //打印输出coursesToSelected是否包含course对象
        System.out.println("取得课程:"+course.name);
        System.out.println("备选课程中是否包含课程:"+course.name+","+coursesToSelect.contains(course));
        //提示输入课程名称
        System.out.println("请输入课程名称:");
        String name= console.next();
        //创建一个新的课程对象,ID和名称,与course对象完全一样
        //Course course2 = new Course(course.id,course.name);
        Course course2 = new Course();
        course2.name = name;
        System.out.println("新创建课程:"+course2.name);
        System.out.println("备选课程中是否包含课程:"+course2.name+","+coursesToSelect.contains(course2));
     }
      //创建学生对象并选课
      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);
                 /**
                  set中,添加某个对象,无论添加多少次
                  最终只会保留一个该对象(的引用)
                  并且,保留的是第一次添加的那一个
                 **/
                 //student.courses.add(null);
                 //student.courses.add(cr);
               }//if end
            }//for end
         }//最外层for end
      }//createStudentAndSelectCours end
     /*
      * 测试Set的contains方法
     */
     public void testSetContains() {
        //提示输入课程名称
        System.out.println("请输入学生已选的课程名称");
        String name=console.next();
        //创建一个新的课程对象,ID和名称,与course对象完全一样
        Course course2 = new Course();
        course2.name = name;
        System.out.println("新创建课程:"+course2.name);
        System.out.println("备选课程中是否包含课程:"+course2.name+","+student.courses.contains(course2));
        //通过indexOf方法来取得某元素的索引位置
        if(coursesToSelect.contains(course2)) {
            System.out.println("课程:"+course2.name+"的索引位置为:"+coursesToSelect.indexOf(course2));
        }
     }//testSetContains end
     public static void main(String[] args) {
        //System.out.println("nihaoya"); 
        SetTest st = new SetTest();
        st.testAdd();
       // st.testListContains();
       // st.testForEach();      // st.createStudentAndSelectCours();
       // st.testSetContains();
        st.testListContains();
        st.testForEach();
        
        /*
         res:
         D:\javacode\code>java SetTest
         取得课程:C语言
         备选课程中是否包含课程:C语言,true
         新创建课程:C语言
         备选课程中是否包含课程:C语言,false
        */
        /*st.testForEach();
        //创建一个学生对象
        Student  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:st.coursesToSelect){
             if(cr.id.equals(courseId)) {
               student.courses.add(cr);*/
               /**
                *  set中,添加某个对象,无论添加多少次
                *  最终只会保留一个该对象(的引用)
                *  并且,保留的是第一次添加的那一个
               */
               //student.courses.add(cr);
               //student.courses.add(null);
             /*}//if end
          }//里层的for
        }//最外层的for       st.testForEachForSet(student);*/
     }//main end
     public void testForEachForSet(Student student) {
        //打印输出,学生所选的课程!
        System.out.println("共选择了:"+student.courses.size()+"门课程!");
        for(Course cr:student.courses) {
          System.out.println("选择了课程:"+cr.id+":"+cr.name);
        }
     }
 }