Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组的条件排序(Ruby)_Arrays_Ruby_Sorting - Fatal编程技术网

Arrays 数组的条件排序(Ruby)

Arrays 数组的条件排序(Ruby),arrays,ruby,sorting,Arrays,Ruby,Sorting,我想按字母顺序对数组排序,除非两个单词的第一个字母相同,在这种情况下,返回的数组应该按照它们在给定字符串中出现的顺序显示它们 例如,“我真的爱喇嘛”=>[“我”、“爱”、“喇嘛”、“真的”] 我已经写了以下内容,但只是得到了错误消息。我可以调整它使其工作,还是我完全走错了路 "I really love lamas".split.sort.collect do |a, z| if a[0] == z[0] puts a z else z a end 需要为方法指定一个块

我想按字母顺序对数组排序,除非两个单词的第一个字母相同,在这种情况下,返回的数组应该按照它们在给定字符串中出现的顺序显示它们

例如,“我真的爱喇嘛”=>[“我”、“爱”、“喇嘛”、“真的”]


我已经写了以下内容,但只是得到了错误消息。我可以调整它使其工作,还是我完全走错了路

"I really love lamas".split.sort.collect do |a, z|
  if a[0] == z[0]
  puts a z
  else 
  z a
  end

需要为方法指定一个块

块必须实现a和b之间的比较,当a跟在b后面时返回-1,当a和b相等时返回0,或者如果b跟在a后面时返回+1

因此,逻辑是:如果首字母相同,则返回
0
;否则,使用
比较整个字符串。排序后,将元素连接到单个字符串

"I really love lamas".split.sort do |a, z|
  if a[0] == z[0]
    0
  else
    a <=> z
  end
end.join(" ")
“我真的爱喇嘛”。split.sort do | a,z|
如果a[0]==z[0]
0
其他的
a z
结束
结束。连接(“”)
继续

c = b.sort { |(a,i),(b,j)| a[0]==b[0] ? i<=>j : a<=>b }
  #=> [["I", 0], ["love", 2], ["llamas", 3], ["really", 1]]
c.map(&:first)
  #=> ["I", "love", "llamas", "really"]
c=b.sort{|(a,i)、(b,j)| a[0]==b[0]?ij:ab}
#=>[[“我”,0],“爱”,2],“骆驼”,3],“真的”,1]]
c、 地图(&:第一)
#=>[“我”、“爱”、“骆驼”、“真的”]

你是说两个连续的单词?或者来自任何距离的话?注意
#collect
每次迭代只提供项,因此它将是
do | a |
,而不是
do | a,z |
“我写了以下内容,但只是得到错误消息。”——他们怎么说?它们发生在哪一行?错误消息通常包含一些建议。你明白了吗?为了让@JörgWMittag的评论更生动一些,如果a[0]==z[0],你的错误消息应该是
NoMethodError(nil:NilClass的未定义方法“[]”)
。方法
[]
的接收器位于
=
左侧的
a
和右侧的
b
。这告诉我们
a
nil
或者
b
nil
(或者两者都是),因为
nil
没有方法
[]
。如果使用语句
重新运行代码,将“a={a},z={z}”放入
中,您将发现
a=>“I”
(第一个单词)和
z=>nil
z
nil
,因为一个字符串(`I')被传递到块,所以您应该只有一个块变量……Ruby计算
a,z=“I”
,它将
“I”
分配给
a
,将
nil
分配给
z
。正如您所看到的,(第一个)错误由错误消息确定。错误消息值得仔细研究。
sort
比@matthewd的评论更不稳定,只有当所使用的
sort
算法具有这样的属性时,这才起作用:对于
arr
中的每对元素
a
b
,当
ab
时,
a
将位于排序数组中的
b
之前,当且仅当
a
位于
arr
中的
b
之前。下面是一个没有该属性的排序方法的简单示例:
类数组;定义我的类型;反向排序;结束;结束;“我真的很喜欢美洲驼”。斯普利特。我的种类是什么?0:a z;结束。加入(“”)#=>“我真的很爱骆驼”
a = str.split
  #=> ["I", "really", "love", "llamas"]
b = a.each_with_index
  #=> #<Enumerator: ["I", "really", "love", "llamas"]:each_with_index>
b.to_a
  #=> [["I", 0], ["really", 1], ["love", 2], ["llamas", 3]]
c = b.sort { |(a,i),(b,j)| a[0]==b[0] ? i<=>j : a<=>b }
  #=> [["I", 0], ["love", 2], ["llamas", 3], ["really", 1]]
c.map(&:first)
  #=> ["I", "love", "llamas", "really"]