学生选课系统第四章第五章第六章

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

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

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

4-3创建学生类和课程类 

 
 

关于为什么要创建含参构造器的问题:

public class Course{
    public String id;
    public String name;
    //含参构造器
    public Course(String id,String name){
    this.id=id;
    this.name=name;
    }
}

便于创建对象时直接赋值,例如Course c1 = new Course("1","数据结构");

只有在实体类Course中添加了有参构造方法public Course(String id, String name) {...},才能这样赋值,否则只能先创建一个对象,再用set方法赋值。

Course c1 = new Course();

c1.setId("1");

c1.setName("数据结构");

4-4添加课程 

 

 
 

第一个 add 方法:是向 List 中插入一条元素 例如:cosTo.add( s1 ); ----插入的元素。

第二个 add 方法:是向 List 指定位置插入一条元素 例如:cosTo.add( 2 , s2 ); ----位置 ,插入的元素。

第二种方法插入的位置不可越界,虽然可以指定位置,但不可超出现有的长度。List 长度起始位置是从0开始。

4-5添加课程2

 
 

 两个 addAll 方法:

第一个 addAll 方法:插入以数组类型创建的多个实例,可一次性插入数组中所有的实例,比起第一个 add 方法,较为简便。

第二个 addAll 方法:和第一个 addAll 插入以数组类型创建的多个实例,但可以指定位置。

注:1、两个 addAll 都是插入以数组类型创建的多个实例。

       2、都会用到Arrays.asList( ),用于将数组转换为List类型。

       3、不管是哪种 add 或是哪种 addAll 取读出来时都是要强转类型和使用List类型的那个属性的 get( ) 方法.

4-6课程查询

以下三种方法都是用来取出List中元素的方法:
-----for循环-----
public void testGet(){
int size=coursesToSelect.size();
for(int i=0;i<size;i++){
Course cr=(Course) coursesToSelect.get(i);
System.out.println("取出的课程:"+cr.getId()+":"+cr.getName());
}
}
-----迭代器-----
Iterator是一个接口,依赖于集合存在的
Iterator it=courseToSelect.iterator();
while(it.hasNext()){
Course cr=(Course) it.next();
System.out.println("课程:" + cr.id + ":" + cr.name);
}

-----for each(增强for循环)-----

凡是继承了Iterable接口的类所生成的对象都可以用for/each循环

for(Object obj:coursesToSelect){//遍历集合中的每一个元素,作为每一个Object变量
Course cr=(Course) obj;
System.out.println("课程:" + cr.id + ":" + cr.name);
}

4-7课程修改

使用set(index,Object element)修改元素,index表示索引位置,element表示新对象。
修改List的元素
public void testModify(){
coursesToSelect.set(4,new Course("7","毛概"));
}

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应用泛型管理课程1

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

4-10应用泛型管理课程2

总结关于list类型的一下用法:
1.创建对象
List list = new ArrayList();
2.向list对象中添加数据
(1)Course crre = new Course("1","数据结构");//一个类的对象
list.add(crre);//将对象添加到list中
(2)Course[] crre = {new Course("",""),new Course("","");//对象的数组
list.addAll(0,Arrays.asList(course));//切记Arrays.asList方法
3.获取集合中的元素
(1)Course temp = (Course)list.get(0);//注意强转
(2)Iterator it = list.iterator();
while(it.hasNext()){
Course cr = (Course)it.next();//迭代遍历,使用iterator方法
}
(3)for(Object obj:list){
Course cr = (Course)obj;
}//foreach方法 ,注意Object的使用
4.集合中参数的修改
list.set(2,new Course("",""));
5.集合中数据的删除
(1)list.remove(位置);
(2)Course[] crr = {(Course)list.get(位置)(Course)list.get(位置)};
list.removeAll(Arrays.asList(crr));//参考addAll
6.带有泛型的list
List<Course> course = new ArrayList<Course>();//相当于添加进去的元素有了具体类型,不再是Object
7.list可以添加子类型的对象
8.list不能直接添加基本类型(int,float等)的对象,如果要添加,需要使用其包装类

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

5-1Map&hasMap简介

5-2使用Map添加学生 

 5-3删除Map中的学生

 5-4修改Map中的学生

第六章

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

"=="和equals()的区别:
 1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
    如果作用于引用类型的变量,则比较的是所指向的对象的地址
  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

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

 
 

判断set中的课程是否存在? 使用set中的contains方法,set中调用contains(obj)方法,contains方法的实现机制:先调用object中的hashcode方法,再调用object中的equals方法。所以要对对象的hashcode()方法和equals方法重写,可以使用eclipse中的source>GENARATE hashcode(),在对象的类中,实现方法的重写。

注意了这里关于使用 Set 集的 hashCode的方法,hashCode方法的工作原理是 Set.contains(E e)的时候,先调用从Object继承而来的hashCode方法,然后在调用equals()方法,连个方法都返回真的时候,才认定Set包含某个元素。jvm运行时,给每个对象分配唯一一个标志身份的标志hanshcode。众类鼻祖Object的hashCode()方法在默认情况下,判断哈希码是不是相同.即如同equals默认情况下比较的是二者是不是同一个内存快。Set集的contains方法,内部就是先调用hashCode再调用equals()方法。很多情况要结合实际对hashCode进行改写

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

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

 6-5Collections.sort()实现List排序

/**
 * 通过调用sort方法对String类型的元素进行排序
 */
public void testSort2(){
	List<String> StringList=new ArrayList<String>();
	//定义存储随机字符的字符串
	String str="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	//创建Random的实例,用于生成随机数
	Random random=new Random();
	//循环10次,生成10个随机长度的字符串
	for(int i=0;i<10;i++){	
		//创建一个StringBuilder类的字符串,方便随意的追加、修改
		//注意要放在for循环内,才能每生成一个字符串并输出后,归零
		StringBuilder sb=new StringBuilder();
		//规定字符串的长度为10以内的随机数
		int length=random.nextInt(10);
		for(int j=0;j<length;j++){
			//获取字符串str中的任意一个字符,然后追加进sb字符串
			int number=random.nextInt(str.length());
			sb.append(str.charAt(number));
		}
		//生成一个字符串后存储进集合中,并输出
		StringList.add(sb.toString());
		System.out.println("生成随机字符串:"+sb.toString());
		
	}
	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);
	}
}

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

6-7Comparable&Comparator简介

 

6-8实现学生序列排序

 

 

 

猜你喜欢

转载自blog.csdn.net/Leonie1/article/details/133295196