2017-07-16 213 views
-1

我目前正在嘗試爲iOS創建應用程序,但我無法獲得一些簡單的代碼。基本上我需要從數組列表中隨機選擇5個元素而不重複元素。我有一個粗略的草案,但它只顯示一個元素。從數組列表中隨機選擇5個元素而不重複元素

這裏是我的代碼:

let array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza"] 

let randomIndex1 = Int(arc4random_uniform(UInt32(array1.count))) 

print(array1[randomIndex1]) 
+0

那是因爲你只得到從該陣列1個唯一索引。 –

+0

即時通訊對不起,我很新,很快。我將如何解決這個問題?如果我告訴它再次打印,我可以得到一個重複的答案 –

回答

5

你可以這樣說:

let array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza", "curry", "sushi", "pizza"] 
var resultSet = Set<String>() 

while resultSet.count < 5 { 
    let randomIndex = Int(arc4random_uniform(UInt32(array1.count))) 
    resultSet.insert(array1[randomIndex]) 
} 

let resultArray = Array(resultSet) 

print(resultArray) 

A set只能包含唯一元素,所以它不能多次具有相同的元素。

我創建了一個空的set,然後只要數組包含少於5個元素(您選擇的數字),我迭代並向set添加了一個隨機元素。

在最後一步中,我們需要將該集合轉換爲數組以獲得所需的數組。

+0

夥計這真棒,非常感謝解釋!我甚至不知道集合存在哈哈。 –

+0

哈哈,不客氣;) –

+0

一個元素可能會被選中不止一次,但它不會被插入到該集合中,因爲它在那時會在那裏。一個集合只能包含唯一元素(2個具有相同值的字符串不能存在於同一集合中)。 –

0
var array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza"] 

while array1.count > 0 { 

    // random key from array 
    let arrayKey = Int(arc4random_uniform(UInt32(array1.count))) 

    // your random number 
    let randNum = array1[arrayKey] 

    // make sure the number ins't repeated 
    array1.removeAtIndex(arrayKey) 
} 

通過從陣列移除你挑值,防止重複的被拾起

+0

你的答案幫助很多ty,但我似乎無法讓它工作。 我結束了這個 變種ARRAY1 = [ 「鮭魚」, 「火雞」, 「色拉」, 「咖喱」, 「壽司」, 「比薩餅」] 而array1.count> 0 { /從陣列/隨機密鑰 讓arrayKey = INT(arc4random_uniform(UInt32的(array1.count))) //您的隨機數 讓randNum = ARRAY1 [arrayKey] //確保該號碼ins't重複 ARRAY1 .removeAtIndex(arrayKey) } –

+0

此解決方案無法處理數組包含2個具有相同值的元素的情況,li例如:[「鮭魚」,「火雞」,「鮭魚」]。 –

0

只是我¢2: Moe Abdul-Hameed的解決方案有一個理論的缺點:如果你在每次迭代滾動相同randomIndex,該while循環將永遠不會退出。這是非常不像壽。

另一種方法是創建原始數組的可變副本,然後排除拿起項目:

var source = array1 
var dest = [String]() 
for _ in 1...5 { 
    let randomIndex = Int(arc4random_uniform(UInt32(source.count))) 
    dest.append(source[randomIndex]) 
    source.remove(at: randomIndex) 
} 

print(dest) 
+0

哇這個解決方案也是驚人的謝謝。是否有可能使每個元素在xcode中都有自己的標籤? 因此,應用程序會顯示所有5個隨機選擇的食物作爲自己的標籤? –

+0

當然,您可以在代碼中創建UILabel(如果我正確地理解了您的問題),如下所示: 'for _ in 1 ... 5 {randomId = int(arc4random_uniform(UInt32(source.count))) let label = UILabel() label.text = source [randomIndex] //根據需要設置標籤(字體,顏色等) //添加約束(我個人使用SnapKit進行簡單的約束設置)或設置框架 parentView.addSubview(標籤) source.remove(在:randomIndex)中的註釋 } ' –

+0

該死,沒有代碼格式(除了內聯):( –

0

如果你不關心改變原有數組,下面的代碼就會把撿到的元素在年底然後它會將數組的最後一部分作爲切片返回。 如果您不關心更改原始數組,那麼這非常有用,優點是它不會使用額外的內存,並且可以在同一陣列上多次調用它。

extension Array { 
    mutating func takeRandomly(numberOfElements n: Int) -> ArraySlice<Element> { 
     assert(n <= self.count) 
     for i in stride(from: self.count - 1, to: self.count - n - 1, by: -1) { 
      let randomIndex = Int(arc4random_uniform(UInt32(i + 1))) 
      self.swapAt(i, randomIndex) 
     } 
     return self.suffix(n) 
    } 
} 

實施例:

var array = [1,2,3,4] 
let a1 = array.takeRandomly(numberOfElements: 2) 
let a2 = array.takeRandomly(numberOfElements: 2) 
相關問題