Set无序性问题

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

慕移动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版的。

写回答 关注

4回答

  • 海边的卡夫
    2018-10-20 11:55:24

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

    }  

    }


  • 成功入行的秃头少女丶
    2018-07-25 18:16:31

    我记得有点模糊,我们期末实训的时候有个老师说Set集合按照哈希算法进行存储,如果一个值的哈希算法的出来的值是固定不变的,那就不会改变存储的位置。不是说这次输入1,2,3得出来3,2,1下次输入1,2,3的出来的就是1,3,2,而是因为他的哈希值没有变,存储的位置也就没有变。如果说错了也请大神进行指正,谢谢哈。

  • 冰断秋
    2018-07-23 16:01:42

    我也是这样的结果,每次输出的结果都是同样的无序。比如说我输入1、2、3,每次都是输出2、1、3

  • qq_快乐的人_0
    2018-07-05 14:28:38

    多试几次,可能你运气比较好,顺序是一样的

    超时空的狩猎 回复慕移动844...

    我也是

    2018-07-19 00:16:06

    共 2 条回复 >

Java入门第三季

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

409792 学习 · 4340 问题

查看课程

相似问题