2017-08-10 15 views
0

假設數組A持有這樣的:如何在數組A中找到一個值不出現在數組B中的隨機索引?

[0, 1, 8, 3, 10, 6, 2] 

和B陣列持有此:

[1, 2] 

怎樣才能在數組A哪個值沒有出現數組B中的隨機指數?以上示例中可能的索引是:

0, 2, 3, 4, 5 

但是如何在Swift中做到這一點?

+0

數組有多大?是否保證這樣的指數存在? –

+0

@MartinR非常小(〜20個int值),而數組B總是小於或等於數組A,而數組B只能保存數組A持有的值。我看到了你對一個答案的評論,現在我正在嘗試結合你的評論和答案。 –

回答

3

當你想用數組元素,它們的指標工作,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.

+2

或flatMap:'let indices = a.enumerated()。flatMap {bset.contains($ 0.element)?零:$ 0.offset}' –

+0

還應該檢查'possibleIndices'是否爲空。 'arc4random_uniform(0)'返回'0',在這種情況下這不是一個有效的索引。 –

+0

@MartinR,這是一個很好的觀點。我會在我的答案中採用它。 – OOPer

1

首先,你必須在兩個數組之間產生差異(除非它們都非常大,在這種情況下遞歸地隨機嘗試可能會導致更好的性能)。

然後,所有你需要做的就是找到你想使用和隨機索引訪問所述元素:

#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. 
} 
+0

「首先,你必須在兩個陣列之間產生差異」是的,但我該怎麼做?其他答案僅顯示搜索差異時剩餘的值,但我需要索引。陣列很小。 –

+0

@ J.Doe我讚賞我的回答,幫助你。請記住,一些更高級的算法可能會導致更好的性能,如果你有大量的集合。但爲此,你不得不求助於一些更高級的文檔和庫。 –

+0

感謝您的回答和時間,但我更喜歡OOper的oneliner :) –

1

如何帶套的工作?

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 
+0

感謝您的回答和時間,但我更喜歡OOper的oneliner :) –

+0

這裏的隨機性在哪裏? –

+0

@MartinR一個集合是無序的,無論是獲得第一個還是足夠用於OP的「隨機」(實現定義)都不明確。如果需要更好的隨機性,你必須結合部分其他解決方案:-) –

相關問題