为了账号安全,请及时绑定邮箱和手机立即绑定

Set无序性问题

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 回答

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

}  

}


0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~
#1

慕移动8447653 提问者

这跟运气没关系吧,我大概输了7,8次了每次顺序都一样的这概率也太低了吧,有没有可能是版本的问题? 还有我Map表输出的结果也永远是顺序的。
2018-07-05 回复 有任何疑惑可以回复我~
#2

超时空的狩猎 回复 慕移动8447653 提问者

我也是
2018-07-19 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409792    人
  • 解答问题       4340    个

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

进入课程

Set无序性问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信