[问题] 关于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