Set無(wú)序性問(wèn)題
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)建一個(gè)課程對(duì)象
//添加方法一
courseToSelect.add(cr1);//通過(guò)調(diào)用add方法添加到被選課程List中去
Course temp=(Course) courseToSelect.get(0);/*List與數(shù)組一樣起
始位置都是0,剛剛只插入了一個(gè)元素。當(dāng)對(duì)象被添加進(jìn)集合中時(shí)會(huì)忽略它本來(lái)的類型,被
當(dāng)做Object類,因此當(dāng)它從集合中取出時(shí)也是一個(gè)Object類,所以要用(Course)將
它強(qiáng)制轉(zhuǎn)化為Course類.
*/
// System.out.println("添加了課程:"+temp.id+":"+temp.name);
?
?
?
Course cr2=new Course("2","C語(yǔ)言");
//添加方法2
courseToSelect.add(0, cr2);/*這樣可以把第0位置cr1擠到第1位置去*/
Course temp2=(Course)courseToSelect.get(0);
// System.out.println("添加了課程:"+temp2.id+":"+temp2.name);
?
?
/* courseToSelect.add(cr1);//此處驗(yàn)證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","匯編語(yǔ)言")};
? ? ?//插入方法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é)英語(yǔ)")};
? ? ?//插入方法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);
}
?
/**
? ? ? * 通過(guò)for each方法訪問(wèn)集合元素
? ? ? * for each 方法實(shí)際上是迭代器方法一種簡(jiǎn)便的寫法
? ? ? * 哈
? ? ? * */
? ? ?public void testForEach() {
? ? System.out.println("有如下課程可供選擇(通過(guò)for each方法訪問(wèn)):");
? ? for(Object obj:courseToSelect) {//這里為什么要用Object類前面講過(guò)
? ? 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)建一個(gè)Scanner對(duì)象,用來(lái)接收輸入的課程ID。
? ? ? ? Scanner console=new Scanner(System.in);
? ? ? ? for(int i=0;i<3;i++) {
? ? ? ? System.out.println("請(qǐng)輸入課程ID");
? ? ? ? String courseId=console.next();
? ? ? ? for(Course cr:st.courseToSelect) {
? ? ? ? if(cr.id.equals(courseId=courseId)) {
? ? ? ? //student.course.add(null);//Set中可以添加空對(duì)象
? ? ? ? student.course.add(cr);//測(cè)試Set是否可以重復(fù)添加。
? ? ? ? student.course.add(cr);//course是Set的對(duì)象,此操作為把符合課程ID的元素添加到Set中去。
? ? ? ? }
? ? ? ? }
? ? ? ? }
? ? ? ? //打印輸出,學(xué)生所選的課程!
? ? ? ? st.testForEachForSet(student);
}
public void testForEachForSet(Student student) {
System.out.println("共選擇了:"+student.course.size()+"門課程!");//結(jié)果表明Set中可以添加重復(fù)的元素不會(huì)報(bào)錯(cuò),但重復(fù)元素只記錄一次。
? ? for(Course cr:student.course) {/*循環(huán)遍歷Set中的每一個(gè)元素只能用foreach方法和iterator方法
? ? ? ? ? ?不能調(diào)用get方法,因?yàn)镾et本身無(wú)序不可能查詢索引位置上的指定元素只能一個(gè)個(gè)迭代出來(lái),因?yàn)镾et無(wú)序所以每一次迭代的結(jié)果
? ? ? ? ? ?都不同。*/
? ? ? ? ? ? System.out.println("選擇了課程:"+cr.id+":"+cr.name);
? ? ? ? ? ?}
? ? ?}
? ? ?
}
我的代碼跟著老師一步步打的應(yīng)該沒(méi)問(wèn)題,但是運(yùn)行時(shí)輸入同樣的課程ID每次結(jié)果都相同,例如“4 1 2”,每次都是對(duì)應(yīng)的課程按順序出來(lái),
Set不應(yīng)該是無(wú)序的嗎,還是說(shuō)因?yàn)镋clipse版本的不同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
我記得有點(diǎn)模糊,我們期末實(shí)訓(xùn)的時(shí)候有個(gè)老師說(shuō)Set集合按照哈希算法進(jìn)行存儲(chǔ),如果一個(gè)值的哈希算法的出來(lái)的值是固定不變的,那就不會(huì)改變存儲(chǔ)的位置。不是說(shuō)這次輸入1,2,3得出來(lái)3,2,1下次輸入1,2,3的出來(lái)的就是1,3,2,而是因?yàn)樗墓V禌](méi)有變,存儲(chǔ)的位置也就沒(méi)有變。如果說(shuō)錯(cuò)了也請(qǐng)大神進(jìn)行指正,謝謝哈。
2018-07-23
我也是這樣的結(jié)果,每次輸出的結(jié)果都是同樣的無(wú)序。比如說(shuō)我輸入1、2、3,每次都是輸出2、1、3
2018-07-05
多試幾次,可能你運(yùn)氣比較好,順序是一樣的