2017-07-16 112 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) 
相关问题