簡體   English   中英

Ruby排序偶數和奇數問題

[英]Ruby sorting even and odd numbers issue

我正在學習Ruby,只是從排序開始。 試圖像這樣對數組進行排序:[1,3,5,2,4,6]而且我真的不太了解代碼的問題。 任何幫助,將不勝感激!

[1,2,3,4,5,6].sort do |x,y|
  if x.odd? and y.odd?
    0
  elsif x.odd?
    -1
  else
     1
end  
  if (x.odd? && y.odd?) or (x.even? && y.even?)
  x <=> y
end 
end

首先,讓我們修復縮進(並轉換為標准Ruby社區編碼風格),以便我們可以更好地了解發生了什么:

[1, 2, 3, 4, 5, 6].sort do |x, y|
  if x.odd? && y.odd?
    0
  elsif x.odd?
    -1
  else
     1
  end

  if (x.odd? && y.odd?) || (x.even? && y.even?)
    x <=> y
  end 
end

現在,問題變得很明顯:您的第一個條件表達式的計算結果為0-11 ,但是使用此值不執行任何操作 該值不存儲在變量中,不作為參數傳遞,不返回。 它只是被忽略。 整個表達式是NO-OP。

這意味着唯一重要的是:

  if (x.odd? && y.odd?) || (x.even? && y.even?)
    x <=> y
  end 

這將返回0兩個元素是相等的, -11為兩個元件是不相等的,但兩者的奇數或偶數,和nil (其以sort單元“這兩個元件都非可比性,它們不具有一定義相對順序”),其中一個元素為奇數,一個元素為偶數。 由於sort要求所有元素都具有可比性,因此它將中止。

解決此問題的最簡單方法可能是將數組分為奇數和偶數,分別對它們進行排序,然后將它們連接起來:

[1, 2, 3, 4, 5, 6].partition(&:odd?).map(&:sort).inject(:concat)
#=> [1, 3, 5, 2, 4, 6]

或者反過來做,將它們全部排序, 然后分區( 謝謝@Eric Duminil ):

[1, 2, 3, 4, 5, 6].sort.partition(&:odd?).inject(:concat)
#=> [1, 3, 5, 2, 4, 6]

這可能是我第一次使用負

  • 如果i是奇數, i % -2-1
  • 如果i是偶數, i % -20

因此,先按i % -2排序,然后再按i排序即可達到理想的結果。

如果要在奇數之前輸入偶數,則可以按i % 2進行排序。


[3, 2, 1, 5, 6, 4].sort_by{ |i| [ i % -2, i] }
#=> [1, 3, 5, 2, 4, 6]

感謝@Stefan的初衷!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM