老師,為什么遍歷Set集合里的元素,一直都是有序的輸出呢?
package com.imooc.collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import javax.swing.text.Style;
public class SetTest {
public List<Course> coursesToSelect;
private Scanner console;
public Student stu;
public SetTest(){
this.coursesToSelect=new ArrayList<Course>(); ? //初始化
this.console=new Scanner(System.in);
}
/**
* 用于往coursesToSelect中添加備選課程
*/
public void testAdd(){
//創(chuàng)建一個課程對象,并通過調(diào)用add方法,添加到備選課程List中
Course cr1=new Course("1","數(shù)據(jù)結(jié)構(gòu)");
coursesToSelect.add(cr1);
Course temp=(Course)coursesToSelect.get(0);
//System.out.println("添加了課程:"+temp.getId()+":"+temp.getName());
Course cr2=new Course("2","C語言");
coursesToSelect.add(0, cr2);
Course temp2=(Course)coursesToSelect.get(0);
//System.out.println("添加了課程:"+temp2.getId()+":"+temp2.getName());
//證明數(shù)據(jù)可重復(fù)
// coursesToSelect.add(cr1);
// Course temp0=(Course)coursesToSelect.get(2);
// System.out.println("添加了課程:"+temp0.getId()+":"+temp0.getName());
Course[] course={new Course("3","離散數(shù)學(xué)"),new Course("4","匯編語言")};
coursesToSelect.addAll(Arrays.asList(course));
Course temp3=(Course)coursesToSelect.get(2);
Course temp4=(Course)coursesToSelect.get(3);
//System.out.println("添加了兩門課程:"+temp3.getId()+":"+temp3.getName()+";"+temp4.getId()+":"+temp4.getName());
Course[] course2={new Course("5","高等數(shù)學(xué)"),new Course("6","大學(xué)英語")};
coursesToSelect.addAll(2, Arrays.asList(course2));
Course temp5=(Course)coursesToSelect.get(2);
Course temp6=(Course)coursesToSelect.get(3);
//System.out.println("添加了兩門課程:"+temp5.getId()+":"+temp5.getName()+";"+temp6.getId()+":"+temp6.getName()+"\n");
}
/**
* 通過for each方法訪問集合元素
* @param args
*/
public void testForEach(){
System.out.println("\n"+"有如下課程待選(通過for each訪問):");
for(Object obj : coursesToSelect){
Course cr=(Course)obj;
System.out.println("課程:"+cr.getId()+":"+cr.getName());
}
}
/**
* 測試List的contains方法
*/
public void testListContains(){
//獲取備選課程序列的第0個元素
Course course=coursesToSelect.get(0);
//打印輸出coursesToSelect是否包含該course對象
System.out.println("取得課程:"+course.getName());
System.out.println("備選課程中是否包含該課程:"+course.getName()+","+coursesToSelect.contains(course));//運(yùn)行測試
//創(chuàng)建一個新課程對象,ID和名稱與course完全相同 ? ?
//(但它們是兩個完全不同的對象,course2并不包含在序列中,所以結(jié)果為false)
//若要為true,則只需重寫equals()方法即可
Course course2=new Course(course.getId(),course.getName());
System.out.println("新創(chuàng)建的課程:"+course2.getName());
System.out.println("備選課程中是否包含該課程:"+course2.getName()+","+coursesToSelect.contains(course2));//運(yùn)行測試
//現(xiàn)在要求從鍵盤接收一個課程名稱
System.out.println("輸入一個課程名稱:");
String name=console.next();
Course course3=new Course();
course3.setName(name);
System.out.println("備選課程中是否包含該課程:"+course3.getName()+","+coursesToSelect.contains(course3));//運(yùn)行測試
if(coursesToSelect.contains(course3)){
System.out.println("課程為:"+course3.getName()+" 的索引位置為:"+coursesToSelect.indexOf(course3));
}
}
//創(chuàng)建學(xué)生對象并選課
public void createStudentAndSelectCourse(){
//創(chuàng)建一個學(xué)生對象
stu = new Student("1", "小明");
System.out.println("歡迎學(xué)生:"+stu.getName()+"來選課!");
//循環(huán)接收3次輸入的數(shù)據(jù),存到學(xué)生信息的courses中去
for(int i=0;i<3;i++){
System.out.println("請輸入要選擇的課程ID:");
//從鍵盤接收用戶輸入的課程ID
String courseId=console.next();
for(Course cr : coursesToSelect){
if(cr.getId().equals(courseId)){
stu.courses.add(cr);
//Set中添加某個對象,無論加多少次,
//最終只會保留一個該對象(的引用),
//并且保留的是第一次添加的那個
//stu.courses.add(cr);
}
}
}
}
/**
* 測試Set的contains方法
*/
public void testSetContains(){
System.out.println("請輸入該學(xué)生已選的課程名稱:");
String name=console.next();
Course course=new Course();
course.setName(name);
System.out.println("備選課程中是否包含該課程:"+course.getName()+","+stu.courses.contains(course));//運(yùn)行測試
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SetTest st=new SetTest();
st.testAdd();
st.testListContains();
st.testForEach();
// st.createStudentAndSelectCourse();
// st.testSetContains();
// st.testForEachForSet(stu);
}
/**
* 打印輸出學(xué)生所選課程,證明無序
*/
public void testForEachForSet(Student stu){
System.out.println("共選擇了:"+stu.courses.size()+"門課程");
for(Course cr : stu.courses){
System.out.println("選擇了課程"+cr.getId()+":"+cr.getName());
}
}
}
2018-07-27
可能你的set集合里迭代出來的序列與List集合迭代的序列是一樣的。你可以輸出一下set集合里對象的每個hashcode值來驗(yàn)證一下。具體百度set集合存儲原理和map集合存儲原理。
2018-07-16
你的student類額