Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 使用spaceship操作符在Ruby中按2个属性对数组中的对象进行排序_Arrays_Ruby_Sorting_Object_Spaceship Operator - Fatal编程技术网

Arrays 使用spaceship操作符在Ruby中按2个属性对数组中的对象进行排序

Arrays 使用spaceship操作符在Ruby中按2个属性对数组中的对象进行排序,arrays,ruby,sorting,object,spaceship-operator,Arrays,Ruby,Sorting,Object,Spaceship Operator,我有一个SizeMatters类,它从给定的字符串创建一个对象。为了在数组中对这些对象进行排序,我实现了(other)方法。但是下面的代码只帮助按大小对对象进行排序。我还希望数组按字母顺序排序 class SizeMatters include Comparable attr :str def <=>(other) str.size <=> other.str.size end def initialize(str) @str = st

我有一个
SizeMatters
类,它从给定的字符串创建一个对象。为了在数组中对这些对象进行排序,我实现了
(other)
方法。但是下面的代码只帮助按大小对对象进行排序。我还希望数组按字母顺序排序

class SizeMatters
  include Comparable
  attr :str
  def <=>(other)
    str.size <=> other.str.size
  end
  def initialize(str)
    @str = str
  end
  def inspect
    @str
  end
end

s1 = SizeMatters.new("Z")
s2 = SizeMatters.new("YY")
s3 = SizeMatters.new("xXX")
s4 = SizeMatters.new("aaa")
s5 = SizeMatters.new("bbb")
s6 = SizeMatters.new("WWWW")
s7 = SizeMatters.new("VVVVV")

[ s3, s2, s5, s4, s1 , s6, s7].sort #[Z, YY, bbb, xXX, aaa, WWWW, VVVVV]
如何编写
(其他)
,以便数组中的对象可以先按大小排序,然后按字母顺序排序?

如下定义

   def <=>(other)
     [str.size, str] <=> [other.str.size, other.str]
   end
def(其他)
[str.size,str][other.str.size,other.str]
结束
如下定义

   def <=>(other)
     [str.size, str] <=> [other.str.size, other.str]
   end
def(其他)
[str.size,str][other.str.size,other.str]
结束

您说过要按大小对字符串进行排序,并按字典(“字典”)顺序对相同长度的字符串进行排序。是的,您需要定义
SizeMatters
,但是为排序定义它可能是错误的,因为这会阻止您以正常方式在类中的其他位置比较stings。考虑保留<代码> <代码>的定义,并用于排序。

class SizeMatters
  include Comparable

  attr_reader :str

  def initialize(str)
    @str = str
  end

  def <=>(other)
    str.size <=> other.str.size
  end

  def sort_criteria
    [str.size, str]
  end

  def lexi_precede?(other)
    str < other.str
  end
end

[s3, s2, s5, s4, s1 , s6, s7].sort_by(&:sort_criteria).map(&:str)
  #=> ["Z", "YY", "aaa", "bbb", "xXX", "WWWW", "VVVVV"]

s1.lexi_precede?(s2)
  #=> false
class SizeMatters
包括可比
属性读取器:str
def初始化(str)
@str=str
结束
def(其他)
str.size其他str.size
结束
def排序标准
[str.size,str]
结束
def lexi_prefore?(其他)
str[“Z”、“YY”、“aaa”、“bbb”、“xXX”、“WWWW”、“VVV”]
s1.lexi_前置?(s2)
#=>错误

您说过要按大小对字符串进行排序,并按字典(“字典”)顺序对相同长度的字符串进行排序。是的,您需要定义
SizeMatters
,但是为排序定义它可能是错误的,因为这会阻止您以正常方式在类中的其他位置比较stings。考虑保留<代码> <代码>的定义,并用于排序。

class SizeMatters
  include Comparable

  attr_reader :str

  def initialize(str)
    @str = str
  end

  def <=>(other)
    str.size <=> other.str.size
  end

  def sort_criteria
    [str.size, str]
  end

  def lexi_precede?(other)
    str < other.str
  end
end

[s3, s2, s5, s4, s1 , s6, s7].sort_by(&:sort_criteria).map(&:str)
  #=> ["Z", "YY", "aaa", "bbb", "xXX", "WWWW", "VVVVV"]

s1.lexi_precede?(s2)
  #=> false
class SizeMatters
包括可比
属性读取器:str
def初始化(str)
@str=str
结束
def(其他)
str.size其他str.size
结束
def排序标准
[str.size,str]
结束
def lexi_prefore?(其他)
str[“Z”、“YY”、“aaa”、“bbb”、“xXX”、“WWWW”、“VVV”]
s1.lexi_前置?(s2)
#=>错误

我只想指出,文档对这种比较的工作原理非常透彻。。。如果可能的话,可以考虑nils,比如
[str.size | | | 0,str | | | |]
。我通常喜欢把这样的东西放到一个单独的
#sorter
方法中。@DavidAldridge,只是没有
NilClass#size
,所以你可能会在
s=str.to\u s;[s.size,s]
。我只想指出,文档对这种比较的工作原理非常透彻。。。如果可能的话,可以考虑nils,比如
[str.size | | | 0,str | | | |]
。我通常喜欢把这样的东西放到一个单独的
#sorter
方法中。@DavidAldridge,只是没有
NilClass#size
,所以你可能会在
s=str.to\u s;[s.size,s]
['a','a']
如何排序?@CarySwoveland就在'a'前面的'a'注意,由于您正在对类的实例数组进行排序,
sort
将返回相同的结果。要让它返回关联字符串的数组,您需要在
.map(&:str)
上加上标记。
['a','a']
如何排序?@CarySwoveland就在'a'之前加上'a',注意,由于您正在对类的实例数组进行排序,
sort
将返回相同的结果。要让它返回一个关联字符串的数组,您需要在
.map(&:str)
上加上标记。