Java第十七次作业:使用Java集合完成学生选课系统

目录

4-1java中的集合框架概述

 4-2Collection接口&list接口简介

 4-3到4-6(学生选课,课程查询)

 4-7修改课程

 4-8删除课程

4-9到4-10应用泛型管理课程 

4-11通过Set集合管理课程

 5-1map&hashMap简介

Map

HashMap类

5-2使用Map添加学生 代码 

 5-3删除Map中的学生

5-4修改Map中的学生

6-1判断list中课程是否存在

6-2判断Set中课程是否存在

 6-3获取list中的课程位置

6-4判断Map中是否包含指定的key和value

6-5应用Collections.sort()实现list排序

6-6尝试对学生序列排序

6-7Comparable&Comparator简介

6-8实现学生序列排序


4-1java中的集合框架概述

 集合的作用

  •   在类的内部,对数据进行组织;简单而快速的搜索大数量的条目;
  •   人有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关元素;
  •    有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型。

 集合与数组的对比:
     数组的长度固定,集合长度可变
     数组只能通过下标访问元素。类型固定,而有的集合可以通过任意类型查找所映射的具体对象。
Java集合框架体系结构
Collection:(List和Queue常用)
List接口(序列):存储的元素是排列有序的,可重复的
    ArrayList(数组序列):
LinkedList(列表)
Queue接口(队列): 存储的元素是排列有序的,可重复的
    LinkedList(列表):
Set接口(集):无序,不可重复。
    HashSel():
Map:会一个key(任意类型的对象)和一个Value(任意类型的对象)两个对象为一个映射去存储数据
Entry是Map的内部类
  常用的类:HashMap:
使用频率最高的类:ArrayList HashSet HashMap

JAVA集合框架体系结构:Collection与Map是两个根接口。
Collection接口:内部存储的是一个个独立的对象。包含:
1、List接口:序列,存储元素排列有序且可重复。实现类:ArrayList,数组序列。实现类:LinkedList,链表。
2、Queue接口:队列,存储元素排列有序且可重复。实现类:LinkedList,链表。
3、Set接口:集,存储元素无序且不可重复。实现类:HashSet,哈希集。
Map接口:内部以<Key,Value>两个对象(任意类型)为一个映射去存储数据,这一个映射就是Entry类(Map的内部类)的实例。包括:实现类:HashMap,哈希表。

 4-2Collection接口&list接口简介

 Collection接口 List接口及其实现类--ArrayList

1.List是有序并且可以重复的集合,被称为序列;

2.List可以精确的控制每个元素的插入位置,或删除某个位置的元素;

3.ArrayList--数组序列,是List的一个重要实现类;

4.ArrayList底层是由数组实现的。

  Collection接口是List、Set、Queue接口的父接口
Collection接口定义了可用于操作List、Set和Queue的方法--增删改查
List接口及其实现类--ArrayList
List是元素有序并且可以重复的集合,被称为序列。
List可以精确的控制每个元素的插入位置,或删除某个位置元素
List有add()插入方法和get()获取方法
ArrayList--数组序列,是List的一个重要实现类
ArrayList底层是由数组实现的,这也是其名字的由来

 4-3到4-6(学生选课,课程查询)

代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class ListTest {
	public List coursesToSelect;
	  public ListTest(){
	   this.coursesToSelect = new ArrayList();
	  }
	  /**
	   * 用于coursesToSelect中添加备选课程,添加到备选课程list中
	   */
	     public void testAdd(){
	    	 //创建一个课程,并通过调用adda,
	      Course cr1 = new Course("1","数据结构");
	      coursesToSelect.add(cr1);
	      Course temp = (Course)coursesToSelect.get(0);
	      System.out.println("添加了课程:" + temp.id + ":" + temp.name);
	      
	      Course cr2 = new Course("2","C语言");
	      coursesToSelect.add(0,cr2);
	      Course temp2 = (Course)coursesToSelect.get(0);
	      System.out.println("添加了课程:" + temp2.id + ":" + temp2.name);
	      
	      coursesToSelect.add(cr1);
	      Course temp0 = (Course)coursesToSelect.get(2);
	      System.out.println("添加了课程:" + temp.id + ":" + temp.name);
	      
	      Course[] course = {new Course("3","离散教学"),new Course("4","汇编语言")};
	      coursesToSelect.addAll(Arrays.asList(course));
	      Course temp3 = (Course)coursesToSelect.get(3);
	      Course temp4 = (Course)coursesToSelect.get(4);
	      
	      System.out.println("添加了两门课程:" + temp3.id + ":" + temp3.name + ";" + temp4.id + ":" + temp4.name);
	     Course[] course2 = {new Course("5","高等数学"),new Course("6","大学英语")};
	     coursesToSelect.addAll(2,Arrays.asList(course2));
	     Course temp5 = (Course)coursesToSelect.get(2);
	     Course temp6 = (Course)coursesToSelect.get(3);
	     System.out.println("添加了两门课程:" + temp5.id + ":" + temp5.name + ";" + temp6.id + ":" + temp6.name);
	     }
	     public void testGet(){
	      int size = coursesToSelect.size();
	      System.out.println("有如下课程待选:");
	      for(int i = 0;i < size;i++){
	       Course cr = (Course)coursesToSelect.get(i);
	       System.out.println("课程:" + cr.id + ":" + cr.name);
	      }
	      
	     }
	     public static void main(String[] args) {
	    	 ListTest lt=new ListTest();
	    	 lt.testAdd();
	    	 lt.testGet();
	     }
}

结果

迭代器

代码

结果 

代码

System.out.println("有如下课程待选(通过foreach访问):");
     for(Object obj:coursesToSelect){//遍历集合中的每一个元素,作为每一个Object变量
      Course cr=(Course) obj;
      System.out.println("课程:" + cr.id + ":" + cr.name);
      }
     }
     public void testModify(){
      coursesToSelect.set(4,new Course("7","毛概"));
      }
     public void testRemove(){
//      Course cr =(Course)coursesToSelect.get(4);
//      System.out.println("我是课程"+cr.id+":"+cr.name);
      System.out.println("即将删除4位置和5位置上的课程!");
      Course[] courses = {(Course)coursesToSelect.get(4),(Course)coursesToSelect.get(3)};
      coursesToSelect.removeAll(Arrays.asList(courses));
     // courseToSelect.remove(cr);
      System.out.println("成功删除");
      testForEach();
     }
     public static void main( String[] args){
      ListTest It = new ListTest();
      It.testAdd();
      It.testGet();
      It.testIterator();
      It.testForEach();
      It.testModify();
      It.testForEach();
     }
}

结果

 4-7修改课程

public List a = new ArrayList();    //创建List

a.add(index,object);                    //j将元素添加到List的第index+1位置

a.get(index);                                //获取List的第index+1位置的元素

a.set(index,object)                      //更新List的第index+1位置的元素

a.remove(index,object)              //删除List的第index+1位置的元素

 4-8删除课程

(删除元素)List中有remove(index),remove(对象值)和removeAll(Arrays.asList(对象数组名))方法来删除容器中元素的值(用法和add类似).
Course是信息课程类,有id和name属性。courseToSelect是list的序列容器对象。
1.remove(index);删除位置要大于0并且小于List(序列容器)的长度。如果要删除全部可以用for循环嵌套此方法。
2.remove(object);先要获得删除的值,用法是先定义一个信息变量通过get()来存放要删除的值,然后用remove(删除的对象值);
public void textdelect{
Course cr=(Course)(courseToSelect.get(4));
courseToSelect.remove(cr);//通过remove(对象值);
或者 courseToSelect.remove(4);//通过remove(删除位置);  }
3.removeAll(Arrays.asList());要删除指定的多个位置  Arrays.asLIst(对象数组名);作用是把数组转换为集合
用法是先创建信息对象数组存放删除元素的值,然后再用removeAll(Arrays.asList(对象数组名))方法,删除集合数组的元素。
public void textdelext2{
Course []course={(Course)(courseToSelect.get(4)),(Course)(courseToSelect.get(5))};  // 定义数组存放要删除的值
courseToSelect.removeAll(Arrays.asList(course));  // 删除4和5位置的值  }

4-9到4-10应用泛型管理课程 

泛型<>;规定List定义的容器只能存储某种类型的元素。不用泛型的话是什么类型的元素都可以插入,因为插入集合是忽略其类型,把它看成为Object类型,取出时需要强行转换对应的类型。
编写带有泛型的集合
List<Course> courseToSelect;  
在构造方法中(实例化的时候也可以不在构造方法,直接实例就可以)
this.courseToSelect=new ArrayList<Course>();   //带有泛型-Course的List类型属性就创建了
泛型集合中,不能添加泛型规定的类型以及其子类型以外的对象,否则会报错。
运用了泛型的话,用foreach语句时 存储变量应该为泛型的类型。for(Course a:courseToSelect),不必再用Object取出再强转,因为已经规定容器里装的都是Course类型。

泛型不能使用基本类型,只能使用包装类
public void testBasicType() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
System.out.println("基本类型必须使用包装类作为泛型!" + list.get(0));
}

4-11通过Set集合管理课程

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

1、Set没有像List中set()方法一样就修改,因为List是有序的,可以指定位置,而Set是无序的。

2、查询遍历时,Set不能用get()方法去获取,因为无序没有指定索引ID,但可以使用foreach和iterator来遍历,但是每次遍历出来可能顺序都不一样,还是因为无序造成的。

3、Set中的size(),add(),addAll(),remove(),removeAll()与List类似。

4、Set还可以添加null;无序演示

 5-1map&hashMap简介

 

Map

提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value

  •         Map中的键值对以Entry类型的对象实例形式存在
  •         键(key值)不可重复,value值可以
  •         每个键最多只能映射到一个值
  •         Map接口提供了分别返回key值集合、value值集合以及Entry(键值对)集合的方法
  •         Map支持泛型,形式如:Map<KV>

HashMap类


HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现
HashMap中的Entry对象是无序排列的
Key值和value值都可以为null,但是一个HashMap只能有一个 key值为null的映射(key值不可重复)

5-2使用Map添加学生 代码 

package com.imooc.collection;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
 
public class MapTest {
 
    /**
     * 用来承装学生类型对象
     */
    public Map<String, Student> students;
    
    /**
     * 在构造器中初始化students属性
     */
    public MapTest() {
        this.students = new HashMap<String, Student>();
    }
    
    /**
     * 测试添加:输入学生ID,判断是否被占用
     * 若未被占用,则输入姓名,创建新学生对象,并且
     * 添加到students中
     */
    public void testPut() {
        // 创建一个Scanner对象,用来获取输入的学生ID和姓名
        Scanner console = new Scanner(System.in);
        int i = 0;
        while (i < 3) {
            System.out.println("请输入学生ID:");
            String ID = console.next();
            // 判断该ID是否被占用
            Student st = students.get(ID);
            if (st == null) {
                // 提示输入学生姓名
                System.out.println("请输入学生姓名:");
                String name = console.next();
                // 创建新的学生对象
                Student newStudent = new Student(ID, name);
                // 通过调用students的put方法,添加ID-学生映射
                students.put(ID, newStudent);
                System.out.println("成功添加学生:" + students.get(ID).name);
                i++;
            } else {
                System.out.println("该学生ID已被占用!");
                continue;
            }
        }
    }
    
    /**
     * 测试Map的keySet方法
     */
    public void testKeySet() {
        // 通过keySet方法,返回Map中的所有“键”的Set集合
        Set<String> keySet = students.keySet();
        // 取得students的容量
        System.out.println("总共有:" + students.size() + "个学生!");
        // 遍历keySet,取得每一个键,再调用get方法取得每个键对应的value
        for (String stuId : keySet) {
            Student st = students.get(stuId);
            if (st != null)
                System.out.println("学生:" + st.name);
        }
    }
    
    /**
     * 通过entrySet方法来遍历Map
     */
    public void testEntrySet() {
        // 通过entrySet方法,返回Map中的所有键值对
        Set<Entry<String, Student>> entrySet = students.entrySet();
        for (Entry<String, Student> entry : entrySet) {
            System.out.println("取得键:" + entry.getKey());
            System.out.println("对应的值为:" + entry.getValue().name);
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        MapTest mt = new MapTest();
        mt.testPut();
        mt.testKeySet();
//        mt.testRemove();
//        mt.testEntrySet();
//        mt.testModify();
//        mt.testEntrySet();
//        mt.testContainsKeyOrValue();
    }

}

 结果

 5-3删除Map中的学生

代码

package com.imooc.collection;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
 
public class MapTest {
 
    /**
     * 用来承装学生类型对象
     */
    public Map<String, Student> students;
    
    /**
     * 在构造器中初始化students属性
     */
    public MapTest() {
        this.students = new HashMap<String, Student>();
    }
    
    /**
     * 测试添加:输入学生ID,判断是否被占用
     * 若未被占用,则输入姓名,创建新学生对象,并且
     * 添加到students中
     */
    public void testPut() {
        // 创建一个Scanner对象,用来获取输入的学生ID和姓名
        Scanner console = new Scanner(System.in);
        int i = 0;
        while (i < 3) {
            System.out.println("请输入学生ID:");
            String ID = console.next();
            // 判断该ID是否被占用
            Student st = students.get(ID);
            if (st == null) {
                // 提示输入学生姓名
                System.out.println("请输入学生姓名:");
                String name = console.next();
                // 创建新的学生对象
                Student newStudent = new Student(ID, name);
                // 通过调用students的put方法,添加ID-学生映射
                students.put(ID, newStudent);
                System.out.println("成功添加学生:" + students.get(ID).name);
                i++;
            } else {
                System.out.println("该学生ID已被占用!");
                continue;
            }
        }
    }
    
    /**
     * 测试Map的keySet方法
     */
    public void testKeySet() {
        // 通过keySet方法,返回Map中的所有“键”的Set集合
        Set<String> keySet = students.keySet();
        // 取得students的容量
        System.out.println("总共有:" + students.size() + "个学生!");
        // 遍历keySet,取得每一个键,再调用get方法取得每个键对应的value
        for (String stuId : keySet) {
            Student st = students.get(stuId);
            if (st != null)
                System.out.println("学生:" + st.name);
        }
    }
    
    /**
     * 测试删除Map中的映射
     */
    public void testRemove() {
        // 获取从键盘输入的待删除学生ID字符串
        Scanner console = new Scanner(System.in);
        while (true) {
            // 提示输入待删除的学生的ID
            System.out.println("请输入要删除的学生ID!");
            String ID = console.next();
            // 判断该ID是否有对应的学生对象
            Student st = students.get(ID);
            if (st == null) {
                // 提示输入的ID并不存在
                System.out.println("该ID不存在!");
                continue;
            }
            students.remove(ID);
            System.out.println("成功删除学生:" + st.name);
            break;
        }
    }
    
    /**
     * 通过entrySet方法来遍历Map
     */
    public void testEntrySet() {
        // 通过entrySet方法,返回Map中的所有键值对
        Set<Entry<String, Student>> entrySet = students.entrySet();
        for (Entry<String, Student> entry : entrySet) {
            System.out.println("取得键:" + entry.getKey());
            System.out.println("对应的值为:" + entry.getValue().name);
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        MapTest mt = new MapTest();
        mt.testPut();
        mt.testKeySet();
        mt.testRemove();
//        mt.testEntrySet();
//        mt.testModify();
//        mt.testEntrySet();
//        mt.testContainsKeyOrValue();//
    }
 
}

 结果

5-4修改Map中的学生

put
V put(K keyV value)
将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当 m.containsKev(k)返回true时,才能说映射 m包含键k的映射关系)。

参数:
key-与指定值关联的键 value-与指定键关联的值

返回:
   以前与key关联的值,如果没有针对key的映射关系,则返回null。(如果该实现支持null值,则返回null也可能表示此映射以前将ull与key关联)。

抛出:

  • UnsupportedOperationException-如果此映射不支持put操作
  • ClassCastException-如果指定键或值的类不允许将其存储在此映射中
  • NullPointerException-如果指定键或值为null,并目此映射不允许null键或值
  • IllegalArgumentException-如果指定键或值的某些属性不允许将其存储在此映射中
package com.imooc.collection;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
 
public class MapTest {
 
    /**
     * 用来承装学生类型对象
     */
    public Map<String, Student> students;
    
    /**
     * 在构造器中初始化students属性
     */
    public MapTest() {
        this.students = new HashMap<String, Student>();
    }
    
    /**
     * 测试添加:输入学生ID,判断是否被占用
     * 若未被占用,则输入姓名,创建新学生对象,并且
     * 添加到students中
     */
    public void testPut() {
        // 创建一个Scanner对象,用来获取输入的学生ID和姓名
        Scanner console = new Scanner(System.in);
        int i = 0;
        while (i < 3) {
            System.out.println("请输入学生ID:");
            String ID = console.next();
            // 判断该ID是否被占用
            Student st = students.get(ID);
            if (st == null) {
                // 提示输入学生姓名
                System.out.println("请输入学生姓名:");
                String name = console.next();
                // 创建新的学生对象
                Student newStudent = new Student(ID, name);
                // 通过调用students的put方法,添加ID-学生映射
                students.put(ID, newStudent);
                System.out.println("成功添加学生:" + students.get(ID).name);
                i++;
            } else {
                System.out.println("该学生ID已被占用!");
                continue;
            }
        }
    }
    
    /**
     * 测试Map的keySet方法
     */
    public void testKeySet() {
        // 通过keySet方法,返回Map中的所有“键”的Set集合
        Set<String> keySet = students.keySet();
        // 取得students的容量
        System.out.println("总共有:" + students.size() + "个学生!");
        // 遍历keySet,取得每一个键,再调用get方法取得每个键对应的value
        for (String stuId : keySet) {
            Student st = students.get(stuId);
            if (st != null)
                System.out.println("学生:" + st.name);
        }
    }
    
    /**
     * 测试删除Map中的映射
     */
    public void testRemove() {
        // 获取从键盘输入的待删除学生ID字符串
        Scanner console = new Scanner(System.in);
        while (true) {
            // 提示输入待删除的学生的ID
            System.out.println("请输入要删除的学生ID!");
            String ID = console.next();
            // 判断该ID是否有对应的学生对象
            Student st = students.get(ID);
            if (st == null) {
                // 提示输入的ID并不存在
                System.out.println("该ID不存在!");
                continue;
            }
            students.remove(ID);
            System.out.println("成功删除学生:" + st.name);
            break;
        }
    }
    
    /**
     * 通过entrySet方法来遍历Map
     */
    public void testEntrySet() {
        // 通过entrySet方法,返回Map中的所有键值对
        Set<Entry<String, Student>> entrySet = students.entrySet();
        for (Entry<String, Student> entry : entrySet) {
            System.out.println("取得键:" + entry.getKey());
            System.out.println("对应的值为:" + entry.getValue().name);
        }
    }
    
    /**
     * 利用put方法修改Map中的已有映射
     */
    public void testModify() {
        // 提示输入要修改的学生ID
        System.out.println("请输入要修改的学生ID:");
        // 创建一个Scanner对象,去获取从键盘上输入的学生ID字符串
        Scanner console = new Scanner(System.in);
        while (true) {
            // 取得从键盘输入的学生ID
            String stuID = console.next();
            // 从students中查找该学生ID对应的学生对象
            Student student = students.get(stuID);
            if (student == null) {
                System.out.println("该ID不存在!请重新输入!");
                continue;
            }
            // 提示当前对应的学生对象的姓名
            System.out.println("当前该学生ID,所对应的学生为:" + student.name);
            // 提示输入新的学生姓名,来修改已有的映射
            System.out.println("请输入新的学生姓名:");
            String name = console.next();
            Student newStudent = new Student(stuID, name);
            students.put(stuID, newStudent);
            System.out.println("修改成功!");
            break;
        }
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        MapTest mt = new MapTest();
        mt.testPut();
        mt.testKeySet();
//        mt.testRemove();
//        mt.testEntrySet();
        mt.testModify();
//        mt.testEntrySet();
    }
 
}

结果

6-1判断list中课程是否存在

package com.imooc.collection;
 
import java.util.ArrayList;
import java.util.Arrays;
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);
    }
    
    /**
     * 用于往coursesToSelect中添加备选课程
     */
    public void testAdd() {
        //创建一个课程对象,并通过调用add方法,添加到备选课程List中
        Course cr1 = new Course("1" , "数据结构");
        coursesToSelect.add(cr1);
        Course temp = (Course) coursesToSelect.get(0);
//        System.out.println("添加了课程:" + temp.id + ":" + temp.name); 
        
        Course cr2 = new Course("2", "C语言");
        coursesToSelect.add(0, cr2);
        Course temp2 = (Course) coursesToSelect.get(0);
//        System.out.println("添加了课程:" + temp2.id + ":" + temp2.name);
        
//        coursesToSelect.add(cr1);
//        Course temp0 = (Course) coursesToSelect.get(2);
//        System.out.println("添加了课程:" + temp.id + ":" + temp.name); 
        
        
        //以下方法会抛出数组下标越界异常
//        Course cr3 = new Course("3", "test");
//        coursesToSelect.add(4, cr3);
        
        Course[] course = {new Course("3", "离散数学"), new Course("4", "汇编语言")};
        coursesToSelect.addAll(Arrays.asList(course));
        Course temp3 = (Course) coursesToSelect.get(2);
        Course temp4 = (Course) coursesToSelect.get(3);
        
//        System.out.println("添加了两门课程:" + temp3.id + ":" + 
//                temp3.name + ";" + temp4.id + ":" + temp4.name);
        
        Course[] course2 = {new Course("5", "高等数学"), new Course("6", "大学英语")};
        coursesToSelect.addAll(2, Arrays.asList(course2));
        Course temp5 = (Course) coursesToSelect.get(2);
        Course temp6 = (Course) coursesToSelect.get(3);
//        System.out.println("添加了两门课程:" + temp5.id + ":" + 
//                temp5.name + ";" + temp6.id + ":" + temp6.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();
        course2.name = name;
        System.out.println("新创建课程:" + course2.name);
        System.out.println("备选课程中是否包含课程:" + course2.name + ", " +
                coursesToSelect.contains(course2));
        // 通过indexOf方法来取得某元素的索引位置
        if (coursesToSelect.contains(course2))
            System.out.println("课程:" + course2.name + "的索引位置为:" + 
                    coursesToSelect.indexOf(course2));
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        SetTest st = new SetTest();
        st.testAdd();
        st.testListContains();
        st.testForEach();
 
 
    }
    
}

结果

6-2判断Set中课程是否存在

package com.imooc.collection;
 
import java.util.ArrayList;
import java.util.Arrays;
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);
    }
    
    /**
     * 用于往coursesToSelect中添加备选课程
     */
    public void testAdd() {
        //创建一个课程对象,并通过调用add方法,添加到备选课程List中
        Course cr1 = new Course("1" , "数据结构");
        coursesToSelect.add(cr1);
        Course temp = (Course) coursesToSelect.get(0);
//        System.out.println("添加了课程:" + temp.id + ":" + temp.name); 
        
        Course cr2 = new Course("2", "C语言");
        coursesToSelect.add(0, cr2);
        Course temp2 = (Course) coursesToSelect.get(0);
//        System.out.println("添加了课程:" + temp2.id + ":" + temp2.name);
        
//        coursesToSelect.add(cr1);
//        Course temp0 = (Course) coursesToSelect.get(2);
//        System.out.println("添加了课程:" + temp.id + ":" + temp.name); 
        
        
        //以下方法会抛出数组下标越界异常
//        Course cr3 = new Course("3", "test");
//        coursesToSelect.add(4, cr3);
        
        Course[] course = {new Course("3", "离散数学"), new Course("4", "汇编语言")};
        coursesToSelect.addAll(Arrays.asList(course));
        Course temp3 = (Course) coursesToSelect.get(2);
        Course temp4 = (Course) coursesToSelect.get(3);
        
//        System.out.println("添加了两门课程:" + temp3.id + ":" + 
//                temp3.name + ";" + temp4.id + ":" + temp4.name);
        
        Course[] course2 = {new Course("5", "高等数学"), new Course("6", "大学英语")};
        coursesToSelect.addAll(2, Arrays.asList(course2));
        Course temp5 = (Course) coursesToSelect.get(2);
        Course temp6 = (Course) coursesToSelect.get(3);
//        System.out.println("添加了两门课程:" + temp5.id + ":" + 
//                temp5.name + ";" + temp6.id + ":" + temp6.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();
        course2.name = name;
        System.out.println("新创建课程:" + course2.name);
        System.out.println("备选课程中是否包含课程:" + course2.name + ", " +
                coursesToSelect.contains(course2));
        
    }
    
    /**
     * 测试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));
    }
    
// 创建学生对象并选课
    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);
                }
            }
        }
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        SetTest st = new SetTest();
        st.testAdd();
//        st.testListContains();
        st.testForEach();
 
        st.createStudentAndSelectCours();
        st.testSetContains();
        
//        st.testForEachForSet(student);
    }
 
    public void testForEachForSet(Student student) {
        //打印输出,学生所选的课程!
        System.out.println("共选择了:" + student.courses.size() + "门课程!");
        for (Course cr : student.courses) {
            System.out.println("选择了课程:" + cr.id + ":" + cr.name);
        }
    }
    
}

 结果

 6-3获取list中的课程位置

package com.imooc.collection;
 
import java.util.ArrayList;
import java.util.Arrays;
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);
    }
    
    /**
     * 用于往coursesToSelect中添加备选课程
     */
    public void testAdd() {
        //创建一个课程对象,并通过调用add方法,添加到备选课程List中
        Course cr1 = new Course("1" , "数据结构");
        coursesToSelect.add(cr1);
        Course temp = (Course) coursesToSelect.get(0);
//        System.out.println("添加了课程:" + temp.id + ":" + temp.name); 
        
        Course cr2 = new Course("2", "C语言");
        coursesToSelect.add(0, cr2);
        Course temp2 = (Course) coursesToSelect.get(0);
//        System.out.println("添加了课程:" + temp2.id + ":" + temp2.name);
        
//        coursesToSelect.add(cr1);
//        Course temp0 = (Course) coursesToSelect.get(2);
//        System.out.println("添加了课程:" + temp.id + ":" + temp.name); 
        
        
        //以下方法会抛出数组下标越界异常
//        Course cr3 = new Course("3", "test");
//        coursesToSelect.add(4, cr3);
        
        Course[] course = {new Course("3", "离散数学"), new Course("4", "汇编语言")};
        coursesToSelect.addAll(Arrays.asList(course));
        Course temp3 = (Course) coursesToSelect.get(2);
        Course temp4 = (Course) coursesToSelect.get(3);
        
//        System.out.println("添加了两门课程:" + temp3.id + ":" + 
//                temp3.name + ";" + temp4.id + ":" + temp4.name);
        
        Course[] course2 = {new Course("5", "高等数学"), new Course("6", "大学英语")};
        coursesToSelect.addAll(2, Arrays.asList(course2));
        Course temp5 = (Course) coursesToSelect.get(2);
        Course temp6 = (Course) coursesToSelect.get(3);
//        System.out.println("添加了两门课程:" + temp5.id + ":" + 
//                temp5.name + ";" + temp6.id + ":" + temp6.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();
        course2.name = name;
        System.out.println("新创建课程:" + course2.name);
        System.out.println("备选课程中是否包含课程:" + course2.name + ", " +
                coursesToSelect.contains(course2));
        // 通过indexOf方法来取得某元素的索引位置
        if (coursesToSelect.contains(course2))
            System.out.println("课程:" + course2.name + "的索引位置为:" + 
                    coursesToSelect.indexOf(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);
                }
            }
        }
    }
    
    /**
     * 测试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));
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        SetTest st = new SetTest();
        st.testAdd();
        st.testListContains();
        st.testForEach();
 
//        st.createStudentAndSelectCours();
//        st.testSetContains();
 
//        st.testForEachForSet(student);
    }
 
    public void testForEachForSet(Student student) {
        //打印输出,学生所选的课程!
        System.out.println("共选择了:" + student.courses.size() + "门课程!");
        for (Course cr : student.courses) {
            System.out.println("选择了课程:" + cr.id + ":" + cr.name);
        }
    }
    
}

结果

6-4判断Map中是否包含指定的key和value

package com.imooc.collection;
 
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
 
public class MapTest {
 
    /**
     * 用来承装学生类型对象
     */
    public Map<String, Student> students;
    
    /**
     * 在构造器中初始化students属性
     */
    public MapTest() {
        this.students = new HashMap<String, Student>();
    }
    
    /**
     * 测试添加:输入学生ID,判断是否被占用
     * 若未被占用,则输入姓名,创建新学生对象,并且
     * 添加到students中
     */
    public void testPut() {
        // 创建一个Scanner对象,用来获取输入的学生ID和姓名
        Scanner console = new Scanner(System.in);
        int i = 0;
        while (i < 3) {
            System.out.println("请输入学生ID:");
            String ID = console.next();
            // 判断该ID是否被占用
            Student st = students.get(ID);
            if (st == null) {
                // 提示输入学生姓名
                System.out.println("请输入学生姓名:");
                String name = console.next();
                // 创建新的学生对象
                Student newStudent = new Student(ID, name);
                // 通过调用students的put方法,添加ID-学生映射
                students.put(ID, newStudent);
                System.out.println("成功添加学生:" + students.get(ID).name);
                i++;
            } else {
                System.out.println("该学生ID已被占用!");
                continue;
            }
        }
    }
    
    /**
     * 测试Map的keySet方法
     */
    public void testKeySet() {
        // 通过keySet方法,返回Map中的所有“键”的Set集合
        Set<String> keySet = students.keySet();
        // 取得students的容量
        System.out.println("总共有:" + students.size() + "个学生!");
        // 遍历keySet,取得每一个键,再调用get方法取得每个键对应的value
        for (String stuId : keySet) {
            Student st = students.get(stuId);
            if (st != null)
                System.out.println("学生:" + st.name);
        }
    }
    
    /**
     * 测试删除Map中的映射
     */
    public void testRemove() {
        // 获取从键盘输入的待删除学生ID字符串
        Scanner console = new Scanner(System.in);
        while (true) {
            // 提示输入待删除的学生的ID
            System.out.println("请输入要删除的学生ID!");
            String ID = console.next();
            // 判断该ID是否有对应的学生对象
            Student st = students.get(ID);
            if (st == null) {
                // 提示输入的ID并不存在
                System.out.println("该ID不存在!");
                continue;
            }
            students.remove(ID);
            System.out.println("成功删除学生:" + st.name);
            break;
        }
    }
    
    /**
     * 通过entrySet方法来遍历Map
     */
    public void testEntrySet() {
        // 通过entrySet方法,返回Map中的所有键值对
        Set<Entry<String, Student>> entrySet = students.entrySet();
        for (Entry<String, Student> entry : entrySet) {
            System.out.println("取得键:" + entry.getKey());
            System.out.println("对应的值为:" + entry.getValue().name);
        }
    }
    
    /**
     * 利用put方法修改Map中的已有映射
     */
    public void testModify() {
        // 提示输入要修改的学生ID
        System.out.println("请输入要修改的学生ID:");
        // 创建一个Scanner对象,去获取从键盘上输入的学生ID字符串
        Scanner console = new Scanner(System.in);
        while (true) {
            // 取得从键盘输入的学生ID
            String stuID = console.next();
            // 从students中查找该学生ID对应的学生对象
            Student student = students.get(stuID);
            if (student == null) {
                System.out.println("该ID不存在!请重新输入!");
                continue;
            }
            // 提示当前对应的学生对象的姓名
            System.out.println("当前该学生ID,所对应的学生为:" + student.name);
            // 提示输入新的学生姓名,来修改已有的映射
            System.out.println("请输入新的学生姓名:");
            String name = console.next();
            Student newStudent = new Student(stuID, name);
            students.put(stuID, newStudent);
            System.out.println("修改成功!");
            break;
        }
    }
    
    /**
     * 测试Map中,是否包含某个Key值或者某个Value值
     */
    public void testContainsKeyOrValue() {
        // 提示输入学生id
        System.out.println("请输入要查询的学生ID:");
        Scanner console = new Scanner(System.in);
        String id = console.next();
        // 在Map中,用containsKey()方法,来判断是否包含某个Key值
        System.out.println("您输入的学生ID为:" + id + ",在学生映射表中是否存在:"
                + students.containsKey(id));
        if (students.containsKey(id))
            System.out.println("对应的学生为:" + students.get(id).name);
        // 提示输入学生姓名
        System.out.println("请输入要查询的学生姓名:");
        String name = console.next();
        // 用containsValue()方法,来判断是否包含某个Value值
        if (students.containsValue(new Student(null,name)))
            System.out.println("在学生映射表中,确实包含学生:" + name);
        else
            System.out.println("在学生映射表中不存在该学生!");
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {    //主方法
        MapTest mt = new MapTest();
        mt.testPut();    //输入学生ID,判断是否被占用,若未被占用,则输入姓名,创建新学生对象,并且添加到students中
        mt.testKeySet();    //测试Map的keySet方法
//        mt.testRemove();    //测试删除Map中的映射
//        mt.testEntrySet();    //通过entrySet方法来遍历Map
//        mt.testModify();    //利用put方法修改Map中的已有映射
//        mt.testEntrySet();    //通过entrySet方法来遍历Map
        mt.testContainsKeyOrValue();    //测试Map中,是否包含某个Key值或者某个Value值
    }
 

结果

6-5应用Collections.sort()实现list排序

package com.imooc.collection;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
 
/**
 * 将要完成:
 * 1.通过Collections.sort()方法,对Integer泛型的List进行排序;
 * 2.对String泛型的List进行排序;
 * 3.对其他类型泛型的List进行排序,以Student为例。
 */
public class CollectionsTest {
 
    /**
     * 1.通过Collections.sort()方法,对Integer泛型的List进行排序;
     * 创建一个Integer泛型的List,插入十个100以内的不重复随机整数,
     * 调用Collections.sort()方法对其进行排序
     */
    public void testSort1() {
        List<Integer> integerList = new ArrayList<Integer>();
        // 插入十个100以内的不重复随机整数
        Random random = new Random();
        Integer k;
        for (int i = 0; i < 10; i++) {
            do {
                k = random.nextInt(100);
            } while (integerList.contains(k));
            integerList.add(k);
            System.out.println("成功添加整数:" + k);
        }
        System.out.println("-------------排序前--------------");
        for (Integer integer : integerList) {
            System.out.println("元素:" + integer);
        }
        Collections.sort(integerList);
        System.out.println("----------------排序后-------------------");
        for (Integer integer : integerList) {
            System.out.println("元素:" + integer);
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        CollectionsTest ct = new CollectionsTest();
        ct.testSort1();
    }
 
}
运行结果如下:
 
 
 
创建String泛型的List,添加三个乱序的String元素,调用sort方法,再次输出排序后的顺序
 
package com.imooc.collection;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
 
/**
 * 将要完成:
 * 1.通过Collections.sort()方法,对Integer泛型的List进行排序;
 * 2.对String泛型的List进行排序;
 * 3.对其他类型泛型的List进行排序,以Student为例。
 */
public class CollectionsTest {
 
    /**
     * 1.通过Collections.sort()方法,对Integer泛型的List进行排序;
     * 创建一个Integer泛型的List,插入十个100以内的不重复随机整数,
     * 调用Collections.sort()方法对其进行排序
     */
    public void testSort1() {
        List<Integer> integerList = new ArrayList<Integer>();
        // 插入十个100以内的不重复随机整数
        Random random = new Random();
        Integer k;
        for (int i = 0; i < 10; i++) {
            do {
                k = random.nextInt(100);
            } while (integerList.contains(k));
            integerList.add(k);
            System.out.println("成功添加整数:" + k);
        }
        System.out.println("-------------排序前--------------");
        for (Integer integer : integerList) {
            System.out.println("元素:" + integer);
        }
        Collections.sort(integerList);
        System.out.println("----------------排序后-------------------");
        for (Integer integer : integerList) {
            System.out.println("元素:" + integer);
        }
    }
    
    /**
     * 2.对String泛型的List进行排序;
     * 创建String泛型的List,添加三个乱序的String元素,
     * 调用sort方法,再次输出排序后的顺序
     */
    public void testSort2() {
        List<String> stringList = new ArrayList<String>();
        stringList.add("microsoft");
        stringList.add("google");
        stringList.add("lenovo");
        System.out.println("------------排序前-------------");
        for (String string : stringList) {
            System.out.println("元素:" + string);
        }
        Collections.sort(stringList);
        System.out.println("--------------排序后---------------");
        for (String string : stringList) {
            System.out.println("元素:" + string);
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        CollectionsTest ct = new CollectionsTest();
//        ct.testSort1();
        ct.testSort2();
 
    }
 
}

 结果

6-6尝试对学生序列排序

6-7Comparable&Comparator简介

6-8实现学生序列排序

package com.imooc.collection;
 
import java.util.Comparator;
 
public class StudentComparator implements Comparator<Student> {
 
    @Override
    public int compare(Student o1, Student o2) {
        // TODO Auto-generated method stub
        return o1.name.compareTo(o2.name);
    }
 
}
对其他类型泛型的List进行排序,以Student为例。
 
package com.imooc.collection;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
 
/**
 * 将要完成:
 * 1.通过Collections.sort()方法,对Integer泛型的List进行排序;
 * 2.对String泛型的List进行排序;
 * 3.对其他类型泛型的List进行排序,以Student为例。
 */
public class CollectionsTest {
 
    /**
     * 1.通过Collections.sort()方法,对Integer泛型的List进行排序;
     * 创建一个Integer泛型的List,插入十个100以内的不重复随机整数,
     * 调用Collections.sort()方法对其进行排序
     */
    public void testSort1() {
        List<Integer> integerList = new ArrayList<Integer>();
        // 插入十个100以内的不重复随机整数
        Random random = new Random();
        Integer k;
        for (int i = 0; i < 10; i++) {
            do {
                k = random.nextInt(100);
            } while (integerList.contains(k));
            integerList.add(k);
            System.out.println("成功添加整数:" + k);
        }
        System.out.println("-------------排序前--------------");
        for (Integer integer : integerList) {
            System.out.println("元素:" + integer);
        }
        Collections.sort(integerList);
        System.out.println("----------------排序后-------------------");
        for (Integer integer : integerList) {
            System.out.println("元素:" + integer);
        }
    }
    
    /**
     * 2.对String泛型的List进行排序;
     * 创建String泛型的List,添加三个乱序的String元素,
     * 调用sort方法,再次输出排序后的顺序
     */
    public void testSort2() {
        List<String> stringList = new ArrayList<String>();
        stringList.add("microsoft");
        stringList.add("google");
        stringList.add("lenovo");
        System.out.println("------------排序前-------------");
        for (String string : stringList) {
            System.out.println("元素:" + string);
        }
        Collections.sort(stringList);
        System.out.println("--------------排序后---------------");
        for (String string : stringList) {
            System.out.println("元素:" + string);
        }
    }
    
    /**
     * 3.对其他类型泛型的List进行排序,以Student为例。
     */
    public void testSort3() {
        List<Student> studentList = new ArrayList<Student>();
        Random random = new Random();
        studentList.add(new Student(random.nextInt(1000) + "", "Mike"));
        studentList.add(new Student(random.nextInt(1000) + "", "Angela"));
        studentList.add(new Student(random.nextInt(1000) + "", "Lucy"));
        studentList.add(new Student(10000 + "", "Beyonce"));
        System.out.println("--------------排序前---------------");
        for (Student student : studentList) {
            System.out.println("学生:" + student.id + ":" + student.name);
        }
        Collections.sort(studentList);
        System.out.println("----------------排序后------------------");
        for (Student student : studentList) {
            System.out.println("学生:" + student.id + ":" + student.name);
        }
        Collections.sort(studentList, new StudentComparator());
        System.out.println("----------------按照姓名排序后-----------------");
        for (Student student : studentList) {
            System.out.println("学生:" + student.id + ":" + student.name);
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        CollectionsTest ct = new CollectionsTest();
//        ct.testSort1();
//        ct.testSort2();
        ct.testSort3();
    }
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值