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","數(shù)據(jù)結(jié)構(gòu)");//創(chuàng)建一個課程對象
//添加方法一
courseToSelect.add(cr1);//通過調(diào)用add方法添加到被選課程List中去
Course temp=(Course) courseToSelect.get(0);/*List與數(shù)組一樣起
始位置都是0,剛剛只插入了一個元素。當(dāng)對象被添加進(jìn)集合中時會忽略它本來的類型,被
當(dāng)做Object類,因此當(dāng)它從集合中取出時也是一個Object類,所以要用(Course)將
它強(qiáng)制轉(zhuǎn)化為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中元素可以重復(fù)
Course temp0=(Course) courseToSelect.get(2);
System.out.println("添加了課程:"+temp0.id+":"+temp0.name);*/
?
? ? ?Course[] cr3= {new Course("3","離散數(shù)學(xué)"),new Course("4","匯編語言")};
? ? ?//插入方法3將用Arrays.asList()方法把數(shù)組cr3變成數(shù)組序列,并插入數(shù)組序列中
? ? ?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","高等數(shù)學(xué)"),new Course("6","大學(xué)英語")};
? ? ?//插入方法4,將cr4插入到數(shù)組序列的指定位置
? ? ?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("歡迎學(xué)生:"+student.name+"選課!");
? ? ? ? //創(chuàng)建一個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是否可以重復(fù)添加。
? ? ? ? student.course.add(cr);//course是Set的對象,此操作為把符合課程ID的元素添加到Set中去。
? ? ? ? }
? ? ? ? }
? ? ? ? }
? ? ? ? //打印輸出,學(xué)生所選的課程!
? ? ? ? st.testForEachForSet(student);
}
public void testForEachForSet(Student student) {
System.out.println("共選擇了:"+student.course.size()+"門課程!");//結(jié)果表明Set中可以添加重復(fù)的元素不會報錯,但重復(fù)元素只記錄一次。
? ? for(Course cr:student.course) {/*循環(huán)遍歷Set中的每一個元素只能用foreach方法和iterator方法
? ? ? ? ? ?不能調(diào)用get方法,因為Set本身無序不可能查詢索引位置上的指定元素只能一個個迭代出來,因為Set無序所以每一次迭代的結(jié)果
? ? ? ? ? ?都不同。*/
? ? ? ? ? ? System.out.println("選擇了課程:"+cr.id+":"+cr.name);
? ? ? ? ? ?}
? ? ?}
? ? ?
}
我的代碼跟著老師一步步打的應(yīng)該沒問題,但是運行時輸入同樣的課程ID每次結(jié)果都相同,例如“4 1 2”,每次都是對應(yīng)的課程按順序出來,
Set不應(yīng)該是無序的嗎,還是說因為Eclipse版本的不同Set的功能有所變化,我的eclipse版本是2017版的。
2018-10-20
是否是Set類型取決于 Student.java?下,你是否給學(xué)生類定義了Set類。
Student.java中Student類代碼如下?注意加粗部分!
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
?* 學(xué)生類
?* @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
我記得有點模糊,我們期末實訓(xùn)的時候有個老師說Set集合按照哈希算法進(jìn)行存儲,如果一個值的哈希算法的出來的值是固定不變的,那就不會改變存儲的位置。不是說這次輸入1,2,3得出來3,2,1下次輸入1,2,3的出來的就是1,3,2,而是因為他的哈希值沒有變,存儲的位置也就沒有變。如果說錯了也請大神進(jìn)行指正,謝謝哈。
2018-07-23
我也是這樣的結(jié)果,每次輸出的結(jié)果都是同樣的無序。比如說我輸入1、2、3,每次都是輸出2、1、3
2018-07-05
多試幾次,可能你運氣比較好,順序是一樣的