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

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

大_神

2018-07-16 11:32

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<Course> coursesToSelect;

private Scanner console;

public Student stu;

public SetTest(){

this.coursesToSelect=new ArrayList<Course>();   //初始化

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

}

}


}


写回答 关注

2回答

  • 成功入行的秃头少女丶
    2018-07-27 08:21:04
    已采纳

    可能你的set集合里迭代出来的序列与List集合迭代的序列是一样的。你可以输出一下set集合里对象的每个hashcode值来验证一下。具体百度set集合存储原理和map集合存储原理。

  • Fz_3
    2018-07-16 14:59:56

    你的student类额

Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409792 学习 · 4340 问题

查看课程

相似问题