- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
首先让我说我是 Ruby 的新手(很明显)。我正在 Codecademy 上学习 Ruby,我对排序功能感到困惑。举个例子:
list = [3,2,1,4]
list.sort { |a,b| b <=> a }
我知道这将按降序返回数组 - [4, 3, 2, 1]。我不明白的是为什么。我知道调用 sort 函数时,数组中的数字被传递到函数中并进行比较,然后函数返回 -1、0 或 1 - 但是然后呢?例如,我猜这是首先要比较的内容:
[3 <=> 2] = 1
但是它对返回的 1 有什么作用呢?得到 1 后数组会是什么样子?
我很困惑,因为我不明白反转比较(a <=> b vs. b <=> a)如何改变数组排序的方向。除非我弄错了,“1 <=> 2”本质上不是返回“1 在 2 之前”,而“2 <=> 1”返回“2 在 1 之后”吗?大同小异,结果却明显不同。
最佳答案
“宇宙飞船”运算符(operator),<=>
不会返回像“a comes before b”这样的英语。它返回什么 sort
需要知道:两个元素之间的关系。具体来说,它会返回您提到的 -1、0 或 1 值。
在a <=> b
, 如果 a
小于 b
(通过对 a
是其实例的类使用的任何比较方法),返回值为 -1。如果相等,则返回 0;如果a
大于 b
, 返回值为 1。
当你做 b <=> a
,返回值基于b
而不是 a
,所以如果 a 更小,你会得到 1,而你在做 a <=> b
时得到 -1 .
因此,虽然英文含义相同,但问题在于细节:即 -1、0 或 1 返回值。该值准确地告诉 Ruby 两个元素如何适合排序数组。
这三个数字的神奇之处在于 quicksort algorithm由 ruby 使用。试图准确解释该算法的工作原理超出了范围,但您基本上可以将其视为对许多值的简单比较。对于数组中的每一项,<=>
与数组中的另一个项目一起调用,以确定这两个项目相对于彼此的位置。一旦进行了足够多的比较,所有这些单独项目的位置就已知,排序就完成了。
作为一个简单的(技术上并不准确,但足够接近)示例,请考虑数组 [3, 2, 7, 1]
.您可以获取一个值来与其他值进行比较,以便开始排序。我们将选择 3。将 3 与所有其他数字进行比较可以得到:
3 <=> 2 == 1
: 3 大于 2,所以 2 必须在 3 的左边。我们的数组现在可能看起来像这样:[2, 3, 7, 1]
3 <=> 7 == -1
: 3 小于 7,所以 7 一定是 3 的右边。我们的数组看起来和以前一样,因为 7 已经在右边。3 <=> 1 == 1
: 3 大于 1,所以 1 必须在 3 的左边。我们的数组现在看起来像这样:[2, 1, 3, 7]
我们知道 7 一定是正确的,因为它是“大于 3”这一边的唯一元素。所以我们只需要找出 3 之前的所有内容的排序顺序:1 和 2。运行与上面类似的比较,我们显然交换 1 和 2 以获得 [1, 2, 3, 7]
。 .
希望对您有所帮助!
关于ruby - Ruby 排序函数到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25452291/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!