集合框架(上) 学生选课——添加,查询,修改,删除课程

package com.imooc.collection;

import java.util.Set;

import java.util.List;

public class Course{

/*课程类*/

  public String id;   ← //因为是演示,所以用公有的属性,在实际开发中,要全部私有化

  public String name;    ← //同上

/*

私有化写法:

private String id;

public String getId(){

  return id;

}

public void setId(String id){

  this.id=id;

}

*/

public Course(String id,String name){    //含参构造器

  this.id=id;

  this.name=name;

}

}

//学生类

public class Student{

public String id;

public String name;

public Set courses;

}

public Student(String id;String name;){

this.id=id;

this.name=name;

this.courses=new HashSet();  /*因为Set是一个接口,不能直接将它实例化,所以用HashSet代替*/

}

//备选课程类

public class ListTest{

//用于存放备选课程的List

public List coursesToSelect;

public ListTest(){

this.coursesToSelect=new ArrayList();  /*因为List是一个接口,不能直接将它实例化,所以用ArrayList代替*/

}

//用于往coursesToSelect中添加备选课程

public void testAdd(){

//创建一个课程对象,并通过调用add方法,添加到备选课程List中

Course cr1=new Course("1","数据结构");

coursesToSelect.add(cr1);    //coursesToSelect.add(index,element);  这样我们就往List中添加一个元素

/*因为刚才只插进一个元素,而List和数组一样,它的起始位置都是0,也就是说第一个位置就是0,所以就通过get(0)来取得刚才插进去的元素*/

/*当一个对象被添加进集合中去的,会忽略它本来的类型,只把它当做Oblect类型,而当把它取出来的时候,也是一个Object,我们就需要通过类型强转,也就是说,对象存入集合都变成Object类型,取出时需要类型转换*/

Course temp=(Course) coursesToSelect.get(0);  //通过List的get()方法把元素取出来

System.out.println("添加了课程:"+temp.id+":"+temp.name);

Course cr2=new Course("2","C语言");

coursesToSelect.add(0,cr2);  /*coursesToSelect.add(index,element);  调用第二个add()方法,因为已经添加了cr1,所以coursesToSelect的长度就为1,然后我们指定添加的位置为0,也就是说,在0位置上添加cr2,这样就会把原先第0位置上的cr1挤到第1位置上去*/

Course temp2=(Course) coursesToSelect.get(0);  //调用get()方法来取得刚才添加的课程

System.out.println("添加了课程:"+temp2.id+":"+temp2.nname);

/*

在调用add()方法的时候,给它传递的位置参数,如果是>它现在的长度,会发生什么情况?

Course cr3=new Course("3","test");

coursesToSelect.add(4,cr3);  //coursesToSelect.add(index,element);

输出:(报错)

Exception in thread "main" java.lang.IndexOutOfBoundsException:Index:4,Size:2  数组下标越界异常

  at java.util.ArrayList.add(ArrayList.java:367)

  at com.imooc.collection.ListTest.testAdd(ListTest.java:38)

  at com.imooc.collection.ListTest.main(ListTest.java:43)

*/

Course[] course={new Course("3","离散数学"),new Course("4","汇编语言")};

courseToSelect.addAll(Arrays.asList(course));  //courseToSelect.addAll(Collection c);   把course数组转变成List

Course temp3=(Course) courseToSelect.get(2);

Course temp4=(Course) courseToSelect.get(3);

System.out.println(“添加了两门课程:”+temp3.id+":"+temp3.name+";"+temp4.id+":"+temp4.name);

Course[] course2={new Course("5","高等数学"),new Course("6","大学英语")};

courseToSelect.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);

 

}

/*

取得List中的元素的方法  为了要依次遍历数组中的每一个元素,首先要取得List的长度,通过调用List的size()方法→int size()

int size()  返回列表中的元素数,如果列表包含多于Integer.MAX_VALUE个元素,则返回Integer.MAX_VALUE

  指定者:

    接口  Collection<E>  中的  size

  返回:

    列表中的元素数

*/

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);

 

}

}

/*

通过迭代器(iterator)来遍历List  iterator() : 返回在此collection的元素上进行迭代的迭代器(同时也是一个接口),本身为了便利集合中元素,不具备存储功能,也就是说,迭代器是依赖于某个集合而存在的,本身不能独立的存在,关于元素返回的顺序没有任何保证(除非此collection是某个能提供保证顺序的类实例)。

指定者:

  接口 Iterator<E>中的 iterator

返回:

  在此collection的元素上进行迭代的Iterator

*/

public void testIterator(){

//通过集合的iterator方法,取得迭代器的实例

Iterator it=coursesToSelect.iterator();

System.out.println("有如下课程待选(通过迭代器访问):");

while(it.hasNaxt()){  //iterator有一个hasNext()方法

Course cr=(Course) it.next();

System.out.println(“课程:”+cr.id+":"+cr.name);

}

}

/*

通过for each方法访问集合元素  for each方法是迭代器方法的一种简便的写法

*/

public void testForEach(){

System.out.println("有如下课程待选(通过for each访问):");

for(Object obj:coursesToSelect){  /*先是定义了Object类型的一个变量,后面是要遍历的一个集合,意思是说,去遍历集合中的每一个元素,把它取出来,作为Object类型的一个变量*/

Course cr=(Course) obj;

System.out.println(“课程:”+cr.id+":"+cr.name);

}

}

/*

修改List中的元素--课程修改

*/

public void testModify(){

courseToSelect.set(4,new Course("7","毛概"));

/*

set(int index,E element):用指定元素替换列表中指定位置的元素(可选操作)

参数:index--要替换的元素的索引  element--要在指定位置存储的元素

返回:以前在指定位置存储的元素

在List中定义了一个set()方法,达到修改相应位置上的元素的目的,这set()方法有两个参数,一个参数是索引位置的值,另一个是将要修改的新对象的值,

*/

}

/*

删除List中的元素

remove(int index):移除列表中指定位置的元素【传入指定的索引位置,就能把相应位置上的索引删除,需要说明的是,这个传递进去的索引的位置,它必须是List长度范围之内,如果超出了这个长度范围,就会报数组下标越界异常,若改成 如下,结果相同】

public void testRemove(){

System.out.println(“即将删除4位置上的课程!”);

coursesToSelect.remove(4);

System.out.println(“成功删除课程!");

testForEach();  //重新打印输出coursesToSelect还剩下哪些元素

}

】*/

/*remove(Object o):从此列表中移除第一次出现的指定元素(如果存在)(可选操作)【取得某位置的元素,并把这个元素传到remove()方法中来实现删除】*/

removeAll(Collection<?> c):从此列表中移除指定collection中包含的其所有元素(可选操作)

public void testRemove(){

System.out.println(“即将删除3位置和4位置上的课程!”);

Course[] courses={(Course) coursesToSelect.get(3),(Course) courseToSelect.get(4)};

coursesToSelect.removeAll(Array.asList(courses));  /*通过coursesToSelect.removeAll()方法,并且通过Arrays工具类,把courses数组转化成一个集合,作为参数传递进去*/

System.out.println(“成功删除课程!");

testForEach();  //重新打印输出coursesToSelect还剩下哪些元素

}

public void testRemove(){

Course cr=(Course) Courses coursesToSelect(4);  /*通过coursesToSelect的get()方法来取得4索引位置上的课程元素*/

System.out.println(“我是课程:”+cr.id+":"+cr.name+“,我即将被删除”);

coursesToSelect.remove(cr);

System.out.println(“成功删除课程!");

testForEach();  //重新打印输出coursesToSelect还剩下哪些元素

}

/*往List中添加一个奇怪的东西*/

public void testType(){

System.out.println("能否往List中添加一些奇怪的东西呢!?");

coursesToSelect.add("我不是课程,我只是一个无辜的字符串!!");

}

public static void main(String[] args){

 ListTest lt=new ListTest();

lt.testAdd();

lt.testGet();

lt.testIterator();

lt.testForEach();

lt.testModify();

lt.testForEach();

lt.testRemove();

lt.testType();

lt.testForEach();

}

}

 输出:添加了课程:1:数据结构

   添加了课程:2:C语言

   添加了两门课程:3:离散数学;4:汇编语言

   添加了两门课程:5:高等数学;6:大学英语

   有如下课程待选:

   课程:2:C语言

   课程:1:数据结构

   课程:5:高等数学

   课程:6:大学英语

   课程:3:离散数学

   课程:4:汇编语言

   有如下课程待选(通过迭代器访问):

   课程:2:C语言

   课程:1:数据结构

   课程:5:高等数学

   课程:6:大学英语

   课程:3:离散数学

   课程:4:汇编语言

   有如下课程待选(通过for each访问):

   课程:2:C语言

   课程:1:数据结构

   课程:5:高等数学

   课程:6:大学英语

   课程:3:离散数学

   课程:4:汇编语言

   有如下课程待选(通过for each访问):

   课程:2:C语言

   课程:1:数据结构

   课程:5:高等数学

   课程:6:大学英语

   课程:7:毛概

   课程:4:汇编语言

   我是课程:7:毛概,我即将被删除

   成功删除课程!

   有如下课程待选(通过for each访问):

   课程:2:C语言

   课程:1:数据结构

   课程:5:高等数学

   课程:6:大学英语

   课程:4:汇编语言

   即将删除3位置和4位置上的课程!

   成功删除课程!

   有如下课程待选(通过for each访问):

   课程:2:C语言

   课程:1:数据结构

   课程:5:高等数学

   报错了

 除了这两个add()方法,还有两个addAll()方法有往List中添加元素的功能;List中的课程是可以重复的

这就要用到泛型:

集合中的元素,可以是任意类型的对象(对象的引用)

如果把某个对象放入集合,则会忽略他的类型,而把他当作Object处理

泛型则是规定了某个集合只可以存放特定类型的对象

泛型会在编译期间进行类型检查,可以直接按指定类型获取集合元素

原文地址:https://www.cnblogs.com/chenyuan7/p/8513545.html