慕移动8447653
2018-07-04 17:42
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class TestSet {
public List<Course> courseToSelect;
public TestSet() {
this.courseToSelect=new ArrayList<Course>();
}
public void testAdd() {
Course cr1=new Course("1","数据结构");//创建一个课程对象
//添加方法一
courseToSelect.add(cr1);//通过调用add方法添加到被选课程List中去
Course temp=(Course) courseToSelect.get(0);/*List与数组一样起
始位置都是0,刚刚只插入了一个元素。当对象被添加进集合中时会忽略它本来的类型,被
当做Object类,因此当它从集合中取出时也是一个Object类,所以要用(Course)将
它强制转化为Course类.
*/
// System.out.println("添加了课程:"+temp.id+":"+temp.name);
Course cr2=new Course("2","C语言");
//添加方法2
courseToSelect.add(0, cr2);/*这样可以把第0位置cr1挤到第1位置去*/
Course temp2=(Course)courseToSelect.get(0);
// System.out.println("添加了课程:"+temp2.id+":"+temp2.name);
/* courseToSelect.add(cr1);//此处验证List中元素可以重复
Course temp0=(Course) courseToSelect.get(2);
System.out.println("添加了课程:"+temp0.id+":"+temp0.name);*/
Course[] cr3= {new Course("3","离散数学"),new Course("4","汇编语言")};
//插入方法3将用Arrays.asList()方法把数组cr3变成数组序列,并插入数组序列中
courseToSelect.addAll(Arrays.asList(cr3));
Course temp3=(Course) courseToSelect.get(2);
Course temp4=(Course) courseToSelect.get(3);
//System.out.println("添加了两门新课程:"+temp3.id+":"+temp3.name+
// ";"+temp4.id+":"+temp4.name);
Course[] cr4= {new Course("5","高等数学"),new Course("6","大学英语")};
//插入方法4,将cr4插入到数组序列的指定位置
courseToSelect.addAll(2,Arrays.asList(cr4));
Course temp5=(Course) courseToSelect.get(4);
Course temp6=(Course) courseToSelect.get(5);
// System.out.println("添加了两门新课程:"+temp5.id+":"+temp5.name+
// ";"+temp6.id+":"+temp6.name);
}
/**
* 通过for each方法访问集合元素
* for each 方法实际上是迭代器方法一种简便的写法
* 哈
* */
public void testForEach() {
System.out.println("有如下课程可供选择(通过for each方法访问):");
for(Object obj:courseToSelect) {//这里为什么要用Object类前面讲过
Course cr=(Course) obj;
System.out.println("课程:"+cr.id+":"+cr.name);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestSet st=new TestSet();
st.testAdd();
st.testForEach();
Student 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:st.courseToSelect) {
if(cr.id.equals(courseId=courseId)) {
//student.course.add(null);//Set中可以添加空对象
student.course.add(cr);//测试Set是否可以重复添加。
student.course.add(cr);//course是Set的对象,此操作为把符合课程ID的元素添加到Set中去。
}
}
}
//打印输出,学生所选的课程!
st.testForEachForSet(student);
}
public void testForEachForSet(Student student) {
System.out.println("共选择了:"+student.course.size()+"门课程!");//结果表明Set中可以添加重复的元素不会报错,但重复元素只记录一次。
for(Course cr:student.course) {/*循环遍历Set中的每一个元素只能用foreach方法和iterator方法
不能调用get方法,因为Set本身无序不可能查询索引位置上的指定元素只能一个个迭代出来,因为Set无序所以每一次迭代的结果
都不同。*/
System.out.println("选择了课程:"+cr.id+":"+cr.name);
}
}
}
我的代码跟着老师一步步打的应该没问题,但是运行时输入同样的课程ID每次结果都相同,例如“4 1 2”,每次都是对应的课程按顺序出来,
Set不应该是无序的吗,还是说因为Eclipse版本的不同Set的功能有所变化,我的eclipse版本是2017版的。
是否是Set类型取决于 Student.java 下,你是否给学生类定义了Set类。
Student.java中Student类代码如下 注意加粗部分!
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 学生类
* @author lenovo
*
*/
public class Student {
public String id;
public String name;
//给Set添加了泛型
public Set<Course>courses;
public Student(String id,String name) {
this.id = id;
this.name = name;
this.courses = new HashSet<Course>();
}
}
我记得有点模糊,我们期末实训的时候有个老师说Set集合按照哈希算法进行存储,如果一个值的哈希算法的出来的值是固定不变的,那就不会改变存储的位置。不是说这次输入1,2,3得出来3,2,1下次输入1,2,3的出来的就是1,3,2,而是因为他的哈希值没有变,存储的位置也就没有变。如果说错了也请大神进行指正,谢谢哈。
我也是这样的结果,每次输出的结果都是同样的无序。比如说我输入1、2、3,每次都是输出2、1、3
多试几次,可能你运气比较好,顺序是一样的
Java入门第三季
409792 学习 · 4340 问题
相似问题