源自:4-11 学生选课---通过 Set 集合管理课程

老师,为什么遍历Set集合里的元素,一直都是有序的输出呢?

package com.imooc.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import javax.swing.text.Style;
public class SetTest {
public List coursesToSelect;
private Scanner console;
public Student stu;
public SetTest(){
this.coursesToSelect=new ArrayList();   //初始化
this.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.getId()+":"+temp.getName());
Course cr2=new Course("2","C语言");
coursesToSelect.add(0, cr2);
Course temp2=(Course)coursesToSelect.get(0);
//System.out.println("添加了课程:"+temp2.getId()+":"+temp2.getName());
//证明数据可重复
//coursesToSelect.add(cr1);
//Course temp0=(Course)coursesToSelect.get(2);
//System.out.println("添加了课程:"+temp0.getId()+":"+temp0.getName());
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.getId()+":"+temp3.getName()+";"+temp4.getId()+":"+temp4.getName());
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.getId()+":"+temp5.getName()+";"+temp6.getId()+":"+temp6.getName()+"\n");
}
/**
* 通过for each方法访问集合元素
* @param args
*/
public void testForEach(){
System.out.println("\n"+"有如下课程待选(通过for each访问):");
for(Object obj : coursesToSelect){
Course cr=(Course)obj;
System.out.println("课程:"+cr.getId()+":"+cr.getName());
}
}
/**
* 测试List的contains方法
*/
public void testListContains(){
//获取备选课程序列的第0个元素
Course course=coursesToSelect.get(0);
//打印输出coursesToSelect是否包含该course对象
System.out.println("取得课程:"+course.getName());
System.out.println("备选课程中是否包含该课程:"+course.getName()+","+coursesToSelect.contains(course));//运行测试
//创建一个新课程对象,ID和名称与course完全相同
//(但它们是两个完全不同的对象,course2并不包含在序列中,所以结果为false)
//若要为true,则只需重写equals()方法即可
Course course2=new Course(course.getId(),course.getName());
System.out.println("新创建的课程:"+course2.getName());
System.out.println("备选课程中是否包含该课程:"+course2.getName()+","+coursesToSelect.contains(course2));//运行测试
//现在要求从键盘接收一个课程名称
System.out.println("输入一个课程名称:");
String name=console.next();
Course course3=new Course();
course3.setName(name);
System.out.println("备选课程中是否包含该课程:"+course3.getName()+","+coursesToSelect.contains(course3));//运行测试
if(coursesToSelect.contains(course3)){
System.out.println("课程为:"+course3.getName()+" 的索引位置为:"+coursesToSelect.indexOf(course3));
}
}
//创建学生对象并选课
public void createStudentAndSelectCourse(){
//创建一个学生对象
stu = new Student("1", "小明");
System.out.println("欢迎学生:"+stu.getName()+"来选课!");
//循环接收3次输入的数据,存到学生信息的courses中去
for(int i=0;i<3;i++){
System.out.println("请输入要选择的课程ID:");
//从键盘接收用户输入的课程ID
String courseId=console.next();
for(Course cr : coursesToSelect){
if(cr.getId().equals(courseId)){
stu.courses.add(cr);
//Set中添加某个对象,无论加多少次,
//最终只会保留一个该对象(的引用),
//并且保留的是第一次添加的那个
//stu.courses.add(cr);
}
}
}
}
/**
* 测试Set的contains方法
*/
public void testSetContains(){
System.out.println("请输入该学生已选的课程名称:");
String name=console.next();
Course course=new Course();
course.setName(name);
System.out.println("备选课程中是否包含该课程:"+course.getName()+","+stu.courses.contains(course));//运行测试
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SetTest st=new SetTest();
st.testAdd();
st.testListContains();
st.testForEach();
//st.createStudentAndSelectCourse();
//st.testSetContains();
//st.testForEachForSet(stu);
}
/**
* 打印输出学生所选课程,证明无序
*/
public void testForEachForSet(Student stu){
System.out.println("共选择了:"+stu.courses.size()+"门课程");
for(Course cr : stu.courses){
System.out.println("选择了课程"+cr.getId()+":"+cr.getName());
}
}
}

提问者:大_神

2018-07-16 11:32