2017-05-31 74 views
0

下面是值的數組列表:如何按升序聲明值列表?

[463, 246, 216, 194, 154, 152, 147, 140, 129, 128, 123, 118, 118, 102, 102, 101, 97, 96, 93, 85] 

如何確保/通過RSpec的斷言數組列表是按升序排列?

+3

'list == list.sort'? – mudasobwa

+0

在問題中提供示例通常很有幫助,但包含任何未由問題引用的數字數組沒有任何用處。 –

回答

5

的simpliest方式可能是:

expect(array.sort).to eq(array) 
+1

要聲明它嚴格按升序排列,請添加一個單獨的測試'expect(array.uniq.size)== array.size'。 –

+0

是的@IIya是有道理的:) –

+1

['Array#sort'](http://ruby-doc.org/core/Array.html#method-i-sort)*不*穩定,所以這不如果有相同的元素,則工作。 –

1

「遞增」是指「下一個元素是不是比目前更小」。你可以編碼成一個謂語容易:

expect(array.each_cons(2).all? {|a, b| a <= b }).to be_truthy 

注意Array#sort穩定,所以像

expect(array.sort).to eq(array) 

不起作用

+0

可否請您提供一個實例,當排序不起作用,但您的答案有效?而且,'be_truthy'是__not零或false__,'be true'就足夠了。 – Ilya

+0

'sort'不穩定,這意味着如果有'<=>'返回'0'的元素,則不能保證它們會保持它們的相對順序。也不能保證'<=>'返回'0'的元素,'=='返回'true'(儘管如果不是bug,我會認爲這很奇怪,但是嘿,人們會做出奇怪的事情)。因此,如果有兩個具有相同順序但不相等的元素,那麼它們可能會通過排序進行交換,並導致原始數組和排序數組不相等。 –

+1

但問題中只有整數,我認爲你的答案是在這種情況下的開銷,但當然,在一些(非常罕見的)條件下是有意義的。 – Ilya