[問題] 關於groupingBy排序

作者: sunkistfool (Toro)   2019-09-20 20:57:40
小弟程式菜雞,最近想考OCPJP
關於一些考古題
List<Student> stds = Arrays.asList(
new Student("Jessy", "Java ME", "Chicago"),
new Student("Helen", "Java EE", "Houston"),
new Student("Mark", "Java ME", "Chicago"));
stds.stream().collect(Collectors.groupingBy(Student::getCourse))
.forEach((src, res) -> System.out.println(res));
這時候不管new Student建立的順序怎麼換
都會顯示
Java EE
Java ME
但是換成
List<Country> couList = Arrays.asList(
new Country("Japan", Country.Continent.ASIA),
new Country("Italy", Country.Continent.EUROPE),
new Country("Germany", Country.Continent.EUROPE));
Map<Country.Continent, List<String>> regionNames =
couList.stream().
collect(Collectors.groupingBy(Country::getRegion
,Collectors.mapping(Country::getName,
Collectors.toList())));
System.out.println(regionNames);
此時顯示
EUROPE在前
ASIA在後
我自己測試是發現排列的順序變成先建立的放後面
所以該怎麼判斷這時候是使用怎樣排序的?
請各位高手幫我解惑QQ
作者: jej (晃奶大馬桶)   2019-09-20 21:28:00
有沒有發現都按照字母順序排列XD
作者: sunkistfool (Toro)   2019-09-20 21:42:00
第一個的分組的確是照著字母排列但是第二個我怎麼試,都會是後丟進去的會放前面第二個我後來在Map前先顯示一次couList的內容結果最後出來的就變成ASIA在前面了完全搞不懂它怎麼排的QQ
作者: ssccg (23)   2019-09-21 00:25:00
groupingBy只會保留組內的順序(傳給downstream的順序)不會保留group間(Map的entry)的順序,就丟進Map了就看Map預設是用HashMap,Java EE在Java ME前面只是HashMap實作剛好造成這個結果而已,跟一開始的順序和字母序都無關換成groupingBy(..., LinkedHashMap::new, toList())就會跟一開始的順序一樣了基本上研究HashMap的key的順序是沒意義的...groupingBy會有個有mapFactory參數的就是讓你換想要的Map
作者: sunkistfool (Toro)   2019-09-21 01:09:00
謝謝大大解釋,因為考試會考顯示的順序,想知道有沒有什麼辦法知道他會先顯示哪個群,因為一下先出現EE在前ME在後會覺得跟字母有關,但是後面ASIA又打翻我的假設,如果考出來我不知道該怎麼選才好
作者: ssccg (23)   2019-09-21 11:14:00
順序的部分,正確答案就是不一定,我覺得題目應該不會是在考順序(如果題目是對的),如果要問解題先PO個選項吧
作者: sunkistfool (Toro)   2019-09-21 11:51:00
謝謝,我等等回去補上
作者: ssccg (23)   2019-09-21 12:22:00
個人認為第二題題目就有問題,畢竟這是看HashMap的實作,會跟用哪版java有關,從API來說就是不確定,隨便選一個可能的
作者: sunkistfool (Toro)   2019-09-21 12:36:00
這考題考出來只能送它了QQ
作者: AI3767 (AIIA)   2019-09-21 16:39:00
第二題, 我貼code實測是 B 耶@@?

Links booklink

Contact Us: admin [ a t ] ucptt.com