java - 集合排序方法与迭代

标签 java

我正在研究扑克牌洗牌问题,并找到了两种解决方案。

目标是将作为 Card 对象存储在数组中的所有 52 张扑克牌洗牌。卡类具有与其关联的 id 和名称。

现在,一种方法是使用 for 循环进行迭代,然后在临时卡对象持有者和随机数生成器的帮助下,我们可以交换两个对象。这一直持续到我们到达一半的牌为止。

另一种方法是使用随机生成器编号实现可比较的重写compareto方法,因此每次调用该方法时我们都会得到一个随机响应。

您认为哪种方式更好?

最佳答案

您不应该通过使用返回随机结果的比较器进行排序来实现这一点,因为这些随机结果可能会彼此不一致(例如,athis demonstration by Mike Bostock 。而且,它需要更长的时间,但这对于洗牌 52 个对象来说并不重要。

standard way to do it 确实涉及循环,但你的描述听起来很奇怪,我怀疑你的想法可能也不会产生理想的结果。 (如果更新问题以更清楚“使用 for 循环进行迭代”方法的含义,我将更新它。)

(有一种通过排序获得良好洗牌的方法:将每个元素与一个随机数配对——例如,0..1 范围内的随机 float ——并且然后使用该数字作为键进行排序。但这比 Fisher-Yates 慢,并且需要额外的内存。在较低级语言中,它通常还需要更多代码;在高级语言中,它可以更简洁;我猜对于 Java最终结果大致相等。)

[编辑添加:] 正如 Louis Wasserman 在评论中非常明智地说的那样,当你的语言的标准库有一个现成的函数来完成某件事时,你通常应该使用它。除非您这样做是为了例如要求您找到并实现算法来解决问题的家庭作业。

关于java - 集合排序方法与迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851870/

相关文章:

java - Spring Boot 处理中的 Oracle DB 故障转移

Java:创建一个以字母字符为索引的数组

java - 为什么应用程序重新启动时该值没有保存到 SharedPreferences 中?

java - 我在 Android 应用程序上获取当前位置时做错了什么

java - spring boot 启动后停止

Java REST 服务 PUT 参数

c# - 单独实现编程设计

java - 从 EOC(同轴以太网)设备检索数据

java - 硬编码数组或资源字符串数组哪个更好用?

java - 使用Java中的doGet()编写HTML代码