Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从数组列表中随机选择5个元素,不重复任何元素_Arrays_Swift_Random_Swift3 - Fatal编程技术网

Arrays 从数组列表中随机选择5个元素,不重复任何元素

Arrays 从数组列表中随机选择5个元素,不重复任何元素,arrays,swift,random,swift3,Arrays,Swift,Random,Swift3,我目前正在尝试为iOS制作一个应用程序,但我无法下载一些简单的代码。基本上,我需要从数组列表中随机选择5个元素,而不需要重复一个元素。我有一个粗略的草稿,但它只显示一个元素 这是我的密码: let array1 = ["salmon", "turkey", "salad", "curry", "sushi", "pizza"] let randomIndex1 = Int(arc4random_uniform(UInt32(array1.count))) print(array1[rando

我目前正在尝试为iOS制作一个应用程序,但我无法下载一些简单的代码。基本上,我需要从数组列表中随机选择5个元素,而不需要重复一个元素。我有一个粗略的草稿,但它只显示一个元素

这是我的密码:

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

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

print(array1[randomIndex1])

通过从数组中删除拾取的值,防止拾取重复的值

您可以这样做:

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)
let array1=[“鲑鱼”、“火鸡”、“沙拉”、“咖喱”、“寿司”、“比萨饼”、“咖喱”、“寿司”、“比萨饼”]
var resultSet=Set()
而resultSet.count<5{
设randomIndex=Int(arc4random_统一(UInt32(array1.count)))
resultSet.insert(array1[randomIndex])
}
让resultArray=Array(resultSet)
打印(resultArray)
集合
只能包含唯一的元素,因此不能多次包含相同的元素

我创建了一个空的
集合
,然后只要数组包含少于5个元素(您选择的数目),我就迭代并向
集合
添加一个随机元素

在最后一步中,我们需要将集合转换为数组,以获得所需的数组。

仅我的第二个: 的解决方案有一个理论上的缺陷:如果在每次迭代中滚动相同的
randomIndex
,那么
while
循环将永远不会退出。这和tho很不一样

另一种方法是创建原始数组的可变副本,然后排除拾取的项:

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)

如果您不关心更改原始数组,下面的代码将把拾取的元素放在数组的末尾,然后将数组的最后一部分作为切片返回。 如果您不关心更改原始阵列,那么这非常有用,其优点是它不使用额外内存,并且您可以在同一阵列上多次调用它

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)
    }
}

SWIFT 5.1

这已经得到了回答,但我敢提出一个更简单的解决方案

如果您将数组转换为一个集合,您将拥有一个没有特定顺序的唯一项数组。如果从该数组中提取5个元素,则最终得到相同的结果

但只有两行;)

例如:

var array = [1,2,3,4]
let a1 = array.takeRandomly(numberOfElements: 2)
let a2 = array.takeRandomly(numberOfElements: 2)
var exampleArray = ["A","B","C","C","C","D","E","F","G","H"]
let uniqueRandomArraySlice = Array(Set(exampleArray)).prefix(5)
打印示例:

["B", "G", "H", "E", "C"]
唯一的要求是对象必须符合哈希协议。大多数标准的Swift类型都会这样做,否则使您自己的类型一致通常很简单


这是因为您只能从该数组中获得1个唯一索引。对不起,我对swift非常陌生。我该如何解决这个问题?如果我让它再打印一次,我可以得到一个重复的答案。你的答案帮助很大,但我似乎无法让它工作。最后,我得到了这个变量array1=[“鲑鱼”、“火鸡”、“沙拉”、“咖喱”、“寿司”、“比萨饼”],而array1.count>0{//数组中的随机键let arrayKey=Int(arc4random_uniform(UInt32(array1.count))//您的随机数let randNum=array1[arrayKey]//确保数组中的数字不重复1.removeAtIndex(arrayKey)}此解决方案无法处理数组包含两个具有相同值的元素的情况,例如:[“salmon”、“turkey”、“salmon”]。这太棒了,非常感谢您的解释!我甚至不知道集合的存在哈哈。一个元素可能会被选择多次,但它不会被插入集合,因为它会在那个时候出现。一个集合只能包含唯一的元素(同一集合中不能存在具有相同值的两个字符串)。哇,这个解决方案也很神奇,谢谢。是否可以在xcode中使每个元素都有自己的标签?因此,应用程序会将所有5种随机选择的膳食显示为有自己的标签?当然,你可以在代码中创建UILabel(如果我正确理解了你的问题),比如:`for u in 1…5{let randomIndex=Int(arc4random_uniform(UInt32(source.count)))let label=UILabel()label.text=source[randomIndex]//根据需要设置标签(字体、颜色等)//添加约束(我个人使用SnapKit轻松设置约束)或设置框架parentView.addSubview(标签)source.remove(at:randomIndex)}`该死,注释中没有代码格式(内联除外):(感谢您的解释,但遗憾的是,我无法让代码在实际项目中运行。对于行var source=array1,它说“不能在属性初始值设定项中使用实例成员'array1',属性初始值设定项在self可用之前运行。对于for uu in 1…5{它说的是“预期声明”“正如编译器所说,您正在尝试在属性初始值设定项内部甚至任何函数外部执行代码。第一种情况是self.array1不可用,第二种情况是语义错误。我怀疑您的情况是第二种情况,因此您需要将代码移到某个函数中,例如viewDidLoad()。请检查这个主题:好主意,但元素不再是随机的。它们是吗?-我刚刚在最新版本上测试了这个,每次运行它们都是完全随机的。在集合的行为改变之前,这不会改变,这似乎是不太可能的。或者你说它不再是随机的是什么意思?:)嘿@bjorn,很抱歉我一开始误解了你的答案。我认为你的想法很聪明,你的答案比我的更简单、更好!谢谢你添加它。我认为如果OP选择它作为公认的答案会更好。
["B", "G", "H", "E", "C"]