亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

輸出順序問題

輸入的是2-1-4,輸出就變為4-1-2了,

試了好多遍都是這個樣子;

為什么?

package?com.imooc.collection;
import?java.util.List;
import?java.util.ArrayList;
import?java.util.Arrays;
import?java.util.Scanner;
public?class?SetTest?{
	//創建帶有泛型的List實例化對象,存放備選課程
	public?List<Course>?coursesToSelect?=?new?ArrayList<Course>();
	
	/**
	?*用于往coursesToSelect中添加課程的方法
	?*/
	
	public?void?testAdd(){
		
		Course?cr1?=?new?Course("1","數據結構");
		coursesToSelect.add(cr1);
		Course?temp?=?(Course)coursesToSelect.get(0);
		//System.out.println("添加了課程:"?+?temp.id?+","+?temp.name);
		
		Course?cr2?=?new?Course("2","C語言");
		coursesToSelect.add(0,cr2);
		Course?temp2?=?(Course)coursesToSelect.get(0);
		//System.out.println("添加了課程:"?+?temp2.id?+?","?+temp2.name);
		
//		//重復添加課程1
//		coursesToSelect.add(cr1);
//		Course?temp0?=?(Course)coursesToSelect.get(2);
//		System.out.println("添加了課程:"?+?temp0.id?+","+?temp0.name);
		?
		
		Course[]?course?=?{new?Course("3","離散數學"),new?Course("4","匯編語言")};
		coursesToSelect.addAll(Arrays.asList(course));
		Course?temp3?=?(Course)coursesToSelect.get(3);
		//Course?temp4?=?(Course)coursesToSelect.get(4);?????
		//System.out.println("添加了兩門課程:"?+?
		//temp3.id?+","?+?temp3.name?+?";"?+?temp4.id?+?","?+?temp4.name);
		
		Course[]?course2?=?{new?Course("5","高等數學"),new?Course("6","大學英語")};
		coursesToSelect.addAll(2,Arrays.asList(course2));
		Course?temp5?=?(Course)coursesToSelect.get(2);
		Course?temp6?=?(Course)coursesToSelect.get(3);
		//System.out.println("添加了兩門課程:"+
		//		temp5.id?+?","?+?temp5.name?+?";"?+?temp6.id?+?","?+temp6.name);
		
	}
	
	/**
	?*?foreach循環遍歷集合內元素,以顯示課程
	?*?@param?args
	?*/
	public?void?testForEach(){
		System.out.println("有如下課程待選(通過for?each訪問):");
		for(Course?cr:coursesToSelect){
			???????
			System.out.println(cr.id?+?","?+?cr.name);
		}
	}
	
	public?static?void?main(String[]?args)?{
		
		SetTest?st?=?new?SetTest();
		st.testAdd();
		st.testForEach();
		//創建學生對象
		Student?student?=?new?Student("1","小羊");
		System.out.println("歡迎:"?+?student.name?+?"選課!");
		//創建一個Scanner對象
		Scanner?input?=?new?Scanner(System.in);
		
		/**
		?*?for循環3次獲取所選課程
		?*/
		
		for(int?i?=?0;i?<?3;i++){
			System.out.println("請輸入所選課程ID:");
			String?courseId?=?input.next();
			//for?each循環遍歷coursesToSelect,找到對應課程
			for(Course?cr:st.coursesToSelect){
				if(cr.id.equals(courseId)){
					student.courses.add(cr);
					/**
					?*?Set中添加某個對象,無論添加多少次,
					?*?最終只會保留第一次添加的對象的引用
					?*/
					//student.courses.add(cr);
				//	student.courses.add(null);?????//可添加null但沒什么意義???
				}
			}
		}
		

		
		st.testForEachForSet(student);????

	}
	/**
	?*?for?each循環
	?*/
	public?void?testForEachForSet(Student?student){??????
		//傳遞參數(此時好比沒有main方法,故對象student還不存在)
		System.out.println("共選擇了"+?student.courses.size()?+?"門課程!");
		System.out.println("你選擇的課程如下:");
		for(Course?cr?:?student.courses){
			
			System.out.println(cr.id?+?","?+cr.name);???//呃呃為啥總是輸出固定的順序(倒序)呢??
		}
	}

}


正在回答

6 回答

?coursesToSelect.add(0,cr2);我敲的這段代碼回報黃線,知道他是沒用,但,怎么老師的沒有呢

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

從數據結構角度來說,其實你每次向哈希集中add一個元素,計算機都會通過哈希函數為其計算一個唯一的哈希值,并且將這個哈希值與集合中現有元素的哈希值比較,來保證集合中的元素不重復。同樣地,哈希集的底層存儲結構中,實際上是按照元素的哈希值從小到大“有序”存儲的,只不過這個順序和你輸入的元素順序不一定相同,因此我們說哈希集是無序的。但是無序不代表隨機,哈希集輸出時通常是按照哈希值的大小輸出的,所以你每次輸出的結果都是一樣的。(至于視頻中老師每次輸出結果都不一樣,應該是和編譯器還有jdk版本有關吧,不同的版本哈希算法不太一樣)

1 回復 有任何疑惑可以回復我~

無序,至于你的問題,你輸入123,他肯定會有所改變,你還是輸入123的話,他的改變會和之前一樣。你輸入213,他的結果又變了。你輸入的每個不同的順序,他打印出來也會和之前的一樣。

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

itme_BJV

求采納= =
2017-02-10 回復 有任何疑惑可以回復我~

因為Set內的對象是無序的,所以并不會按照輸入的順序輸出。

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

暮女神 提問者

我的意思是,每次輸出的順序都是一樣的,為什么?
2017-02-08 回復 有任何疑惑可以回復我~
#2

thomasstar 回復 暮女神 提問者

其實任何的隨機都是偽隨機,根據不同的機器,存放順序也不同(只是猜測),只要知道無序不可重復就好,知道只能用foreach和iterator遍歷就好
2017-02-09 回復 有任何疑惑可以回復我~

無序的

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

代碼貼出來看看

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

暮女神 提問者

貼了,大佬看一下
2017-02-08 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Java入門第三季
  • 參與學習       409766    人
  • 解答問題       4543    個

Java中你必須懂得常用技能,不容錯過的精彩,快來加入吧

進入課程

輸出順序問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號