假設數組A持有這樣的:如何在數組A中找到一個值不出現在數組B中的隨機索引?
[0, 1, 8, 3, 10, 6, 2]
和B陣列持有此:
[1, 2]
怎樣才能在數組A哪個值沒有出現數組B中的隨機指數?以上示例中可能的索引是:
0, 2, 3, 4, 5
但是如何在Swift中做到這一點?
假設數組A持有這樣的:如何在數組A中找到一個值不出現在數組B中的隨機索引?
[0, 1, 8, 3, 10, 6, 2]
和B陣列持有此:
[1, 2]
怎樣才能在數組A哪個值沒有出現數組B中的隨機指數?以上示例中可能的索引是:
0, 2, 3, 4, 5
但是如何在Swift中做到這一點?
當你想用數組元素,它們的指標工作,enumerated()
可以是一個很好的工具:
var a = [0, 1, 8, 3, 10, 6, 2]
var b = [1, 2]
var possibleIndices = a.enumerated()
.filter{!b.contains($0.element)}
.map{$0.offset}
print(possibleIndices)
//->[0, 2, 3, 4, 5]
(當b
可能很大,好讓它Set
)
然後:
(當我們可以假設b
從未持有a
的所有內容。)
var randomIndexToPossibleIndices = Int(arc4random_uniform(UInt32(possibleIndices.count)))
var randomIndex = possibleIndices[randomIndexToPossibleIndices]
如果上述假設不能滿足,possibleIndices
可能爲空。所以,你最好randomIndex
可選:
var randomIndex: Int? = nil
if !possibleIndices.isEmpty {
var randomIndexToPossibleIndices = Int(arc4random_uniform(UInt32(possibleIndices.count)))
randomIndex = possibleIndices[randomIndexToPossibleIndices]
}
感謝馬丁R.
或flatMap:'let indices = a.enumerated()。flatMap {bset.contains($ 0.element)?零:$ 0.offset}' –
還應該檢查'possibleIndices'是否爲空。 'arc4random_uniform(0)'返回'0',在這種情況下這不是一個有效的索引。 –
@MartinR,這是一個很好的觀點。我會在我的答案中採用它。 – OOPer
首先,你必須在兩個數組之間產生差異(除非它們都非常大,在這種情況下遞歸地隨機嘗試可能會導致更好的性能)。
然後,所有你需要做的就是找到你想使用和隨機索引訪問所述元素:
#if os(Linux)
let j = Int(random() % ((count-1)))
#else
let j = Int(Int(arc4random()) % ((count-1)))
#endif
會給你一個合適的指數
如果然後使用這個指標,要在數組中找到原始元素的元素,您將獲得結果。
如果萬一你的元素是整數,從而可能發生碰撞,我會做的事情是遞歸地找到它來解決你的問題。請記住,這可能會導致性能下降。
查找到集合在這裏迅速函數式編程部分: Swift Guide to map filter reduce
舉例來說,你可以通過以下方式使用過濾器(我不知道這是不是最好的方式):
collection.filter {
var found = false;
for element in bCollection {
if element == $0 {
found = true;
}
}
return !found; // Might be better to turn true/false thing around in the above code to slightly improve performance.
}
「首先,你必須在兩個陣列之間產生差異」是的,但我該怎麼做?其他答案僅顯示搜索差異時剩餘的值,但我需要索引。陣列很小。 –
@ J.Doe我讚賞我的回答,幫助你。請記住,一些更高級的算法可能會導致更好的性能,如果你有大量的集合。但爲此,你不得不求助於一些更高級的文檔和庫。 –
感謝您的回答和時間,但我更喜歡OOper的oneliner :) –
如何帶套的工作?
let a = [0, 1, 8, 3, 10, 6, 2]
let b = [1, 2]
var setA = Set(a)
var setB = Set(b)
setA.subtract(setB)
var index: Int? = nil
if let first = setA.first {
index = a.index(of: first)
}
// if index == nil no such index exists
感謝您的回答和時間,但我更喜歡OOper的oneliner :) –
這裏的隨機性在哪裏? –
@MartinR一個集合是無序的,無論是獲得第一個還是足夠用於OP的「隨機」(實現定義)都不明確。如果需要更好的隨機性,你必須結合部分其他解決方案:-) –
數組有多大?是否保證這樣的指數存在? –
@MartinR非常小(〜20個int值),而數組B總是小於或等於數組A,而數組B只能保存數組A持有的值。我看到了你對一個答案的評論,現在我正在嘗試結合你的評論和答案。 –