请教Java题

h
hannsg
楼主 (北美华人网)
为什么答案是B呢?
Given: public static Function<String,String> swap = s -> { if(s.equals("Australia")) return "New Zealand"; else return s; }; And given: Set<String> islandNations = Set.of("Australia", "Japan", "Taiwan", "Cyprus", "Cuba"); islandNations = islandNations.stream() .map(swap) .map(n -> n.substring(0, 1)) .collect(Collectors.toSet()); for(String s : islandNations){ System.out.print(s); }
What is the output? a.TJNC b.CTJN c.TCNJC d.TCAJ e.TCNJ f.TCAJC
g
gokgs
E?
玛玾888
哎呀我的天,很怕这个。曾经想转行,试了试就放弃了。楼主你要坚持下去。
w
wxcslan2
java语法怎么这么垃圾啊现在
z
zoaldyeck11
我为啥得出是njtc?
德州小妹

Set<String> islandNations = Set.of("Australia", "Japan", "Taiwan", "Cyprus", "Cuba"); islandNations = islandNations.stream() .map(swap) //Set.of("New Zealand", "Japan", "Taiwan", "Cyprus", "Cuba"); .map(n -> n.substring(0, 1)) //("N", "J", "T", "C", "C") .collect(Collectors.toSet()); //("N", "J", "T", "C") for(String s : islandNations){ System.out.print(s); }
l
ljmdtc
set里顺序应该是随机的啊,只知道是TJNC,天知道什么顺序
h
hannsg

Set<String> islandNations = Set.of("Australia", "Japan", "Taiwan", "Cyprus", "Cuba"); islandNations = islandNations.stream() .map(swap) //Set.of("New Zealand", "Japan", "Taiwan", "Cyprus", "Cuba"); .map(n -> n.substring(0, 1)) //("N", "J", "T", "C", "C") .collect(Collectors.toSet()); //("N", "J", "T", "C") for(String s : islandNations){ System.out.print(s); }

德州小妹 发表于 2021-04-23 01:21

太牛了!
德州小妹
顺序应该是随机的,只能选a b e 了
一年明月
Java是这么说的: Collectors toSet() returns a Collector that accumulates the input elements into a new Set. There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned. This is an unordered Collector i.e, the collection operation does not commit to preserving the encounter order of input elements.
所以它可以给你A,B,E中的任何一个,都不算出错。
n
nazaban
回复 1楼hannsg的帖子
直接找到ide run 一下不就行了吗
t
trymeagain
回复 1楼hannsg的帖子
This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.
只要有NJTC就是对的吧,难道不是多选题?
h
hannsg
看来还是跟Collectors.toSet()有关,set在后台应该是排序的,可能是二叉树?打印的时候,C排在最底端叶子上所以必定是第一个打印出来的?
  Set<String> islandNations = Set.of("Australia", "Japan", "Taiwan", "Cyprus", "Cuba");     var list = islandNations.stream()         .map(swap)         .map(n->n.substring(0,1))         .collect(Collectors.toList());     for (var s:list){       System.out.print(s);     }
换成Collectors.toList()以后结果就是随机的,比如: TCCJN

h
hannsg
回复 1楼hannsg的帖子
直接找到ide run 一下不就行了吗
nazaban 发表于 2021-04-23 01:38

说起IDE,我的NetBeans,文字输入一切换到中文就死啊。一切换回英文有一切正常。死了无数次才意识到的。 这年头java也太诡异了
f
fitzroy
taiwan是nation,弱智技术问题 + 复杂政治问题,是想排除中国程序猿,招印度程序猿。
h
huashan2018
看来还是跟Collectors.toSet()有关,set在后台应该是排序的,可能是二叉树?打印的时候,C排在最底端叶子上所以必定是第一个打印出来的?
  Set<String> islandNations = Set.of("Australia", "Japan", "Taiwan", "Cyprus", "Cuba");     var list = islandNations.stream()         .map(swap)         .map(n->n.substring(0,1))         .collect(Collectors.toList());     for (var s:list){       System.out.print(s);     }
换成Collectors.toList()以后结果就是随机的,比如: TCCJN


hannsg 发表于 2021-04-23 02:24

这道题目本身出得太有问题了,我觉得不应该多想。 正确的答案应该是那三个都对。
但是如果你真拿到这代码去IDE里面run,出来的的确又是B。哈哈。 但如果真要考到B这么艰深,我觉得根本就没有必要。 B的原因是因为单字母在java set里面用的是MAP二叉树, 然后用ASCII码做成随机码,再用后序遍历打印出来的
不信你可以加个Uganda(其实就是字母U),出来的顺序一定是CTUJN
M
Mimmim
应该和树没关系。Collectors.toSet是到HashSet。不同版本java,不同size的 Hash set 的 hash function可能会不同。码农应该不关心这个,所以ABE都算对。如果要你只选一个,那就算出题人有意刁难了。
h
huashan2018
如果你还有兴趣继续研究的话,可以在最后加两个shuffle ,然后再打印,然后你会发现打印出来的会成为完全排序好的字母序了。这是因为充分shuffle之后,以ascii码排序的二叉树成为一个完全排序的单枝线性树了。
         for (int i = 0; i < 1000; ++i) {             islandNations.add("" + i);          }          for (int i = 0; i < 1000; ++i) {             islandNations.remove("" + i);          }                   for(String s : islandNations){              System.out.print(s);          }
h
hannsg
如果你还有兴趣继续研究的话,可以在最后加两个shuffle ,然后再打印,然后你会发现打印出来的会成为完全排序好的字母序了。这是因为充分shuffle之后,以ascii码排序的二叉树成为一个完全排序的单枝线性树了。
         for (int i = 0; i < 1000; ++i) {             islandNations.add("" + i);          }          for (int i = 0; i < 1000; ++i) {             islandNations.remove("" + i);          }                   for(String s : islandNations){              System.out.print(s);          }
huashan2018 发表于 2021-04-23 02:44

这太神奇了。谢谢指教!
R
ReesWitherspoon
如果你还有兴趣继续研究的话,可以在最后加两个shuffle ,然后再打印,然后你会发现打印出来的会成为完全排序好的字母序了。这是因为充分shuffle之后,以ascii码排序的二叉树成为一个完全排序的单枝线性树了。
         for (int i = 0; i < 1000; ++i) {             islandNations.add("" + i);          }          for (int i = 0; i < 1000; ++i) {             islandNations.remove("" + i);          }                   for(String s : islandNations){              System.out.print(s);          }
huashan2018 发表于 2021-04-23 02:44

华人很强大!
g
gokgs
这道题目本身出得太有问题了,我觉得不应该多想。 正确的答案应该是那三个都对。
但是如果你真拿到这代码去IDE里面run,出来的的确又是B。哈哈。 但如果真要考到B这么艰深,我觉得根本就没有必要。 B的原因是因为单字母在java set里面用的是MAP二叉树, 然后用ASCII码做成随机码,再用后序遍历打印出来的
不信你可以加个Uganda(其实就是字母U),出来的顺序一定是CTUJN
huashan2018 发表于 2021-04-23 02:38

牛,懂这么多。
t
ttyp0
说起IDE,我的NetBeans,文字输入一切换到中文就死啊。一切换回英文有一切正常。死了无数次才意识到的。 这年头java也太诡异了
hannsg 发表于 2021-04-23 02:27

eclipse啊 话说做这些八股就是文科生的事情。类似回字的四种写法。理科生直接run一下,简单直接
试试看
为什么答案是B呢?
Given: public static Function<String,String> swap = s -> { if(s.equals("Australia")) return "New Zealand"; else return s; }; And given: Set<String> islandNations = Set.of("Australia", "Japan", "Taiwan", "Cyprus", "Cuba"); islandNations = islandNations.stream() .map(swap) .map(n -> n.substring(0, 1)) .collect(Collectors.toSet()); for(String s : islandNations){ System.out.print(s); }
What is the output? a.TJNC b.CTJN c.TCNJC d.TCAJ e.TCNJ f.TCAJC

hannsg 发表于 2021-04-23 01:05

好问题
试试看
也好奇,前面次序可以随意。 但 [C, T, J, N]是固定次序的。 太伤脑。
f
fitzroy
taiwan是nation,弱智技术问题 + 复杂政治问题,是想排除中国程序猿,招印度程序猿。
fitzroy 发表于 2021-04-23 02:33

再说一遍,set 无序,这个弱智考题宗旨就是让马公麻婆承认台湾是一个国家。
我小孩有学过java,我也看过,最近也有些接触编程,普通人没人这样写的吧。
第一,这样写通不过code review的吧。这个我们公司碰到好多次了,developer一直说code review的重要性,怕outsource的人写的太乱。 第二,看了大家回应,谁会直接用toset()的结果,除非顺序无所谓,不需要知道,否则肯定会先sort。
最后想说为啥要考那么无聊的题目?没人会这样写,而且即使不知道这种无聊的答案还有debug啊,不应该放更多精力在其他地方吗?这样考进来的职员不会很机车吗?用心的重点都不一样。
h
hannsg
taiwan是nation,弱智技术问题 + 复杂政治问题,是想排除中国程序猿,招印度程序猿。
fitzroy 发表于 2021-04-23 02:33

这个是oracle university上的java 11 developer mock exam上的。
虽然中国大陆不承认,台湾事实上就是个国家啊,还有邦交国的呢。
c
changheruhailiu
这个是oracle university上的java 11 developer mock exam上的。
虽然中国大陆不承认,台湾事实上就是个国家啊,还有邦交国的呢。
hannsg 发表于 2021-04-23 19:44

现在还有人考java certification吗,我老一堆java certification都是20年前Sun时代的了。。。
觉得Java毁在Oracle 手里了
试试看
这个考题好无聊!!!我在IDE上run了几十百遍,debug了几十遍,找不出 toSet() 的排序规律。
湾区的马工麻婆大佬进来走两步。
这个考题好无聊!!!我在IDE上run了几十百遍,debug了几十遍,找不出 toSet() 的排序规律。
湾区的马工麻婆大佬进来走两步。
试试看 发表于 2021-04-23 20:37

即使知道也没有意义啊,除非是你写过这个library的才知道,一般用的人call toset()直接用肯定不考虑排序,考虑排序的肯定会sort. 如果连这个都要知道真的太浪费时间了,而且随时会更新library啊,更新过如果里面有更多优化结果可能就不一样了。
碰到要考这个的老板以后有的苦让你吃。这不是各种为了刁难你而刁难吗?
h
hannsg
这个考题好无聊!!!我在IDE上run了几十百遍,debug了几十遍,找不出 toSet() 的排序规律。
湾区的马工麻婆大佬进来走两步。
试试看 发表于 2021-04-23 20:37

我后来想了想,这个set是不允许有重复的,所以后台一定是二叉树,C最小,所以是二叉树最下端左边的叶子,遍历的时候第一个打印出来。排除法下来只有一个选项。其他什么顺序就搞不懂了.
而且set,tree都还有load factor,会有空叶子,更加搞不明白