如何打乱问题并显示数组的一项

Posted

技术标签:

【中文标题】如何打乱问题并显示数组的一项【英文标题】:How to shuffle questions and show one item of an array 【发布时间】:2017-11-10 10:47:43 【问题描述】:

我正在处理一个测验项目,但是目前我发现很难随机排列问题并从数组中选择单个项目。请在下面找到我的代码。

我选择控制器的类别是:

struct Quiz 
private(set) var name = String()
private(set) var plist: NSArray



init(name: String) 
self.name = name
plist = NSArray(contentsOfFile: Bundle.main.path(forResource: name, ofType: "plist")!)!



static let quizzes = [Quiz(name: "Development"), Quiz(name: "Reflexes")]

我的测验控制器是

override func viewDidLoad()     
super.viewDidLoad()


set = shuffledQuiz([[Quiz.quizzes[currentTopicIndex].plist]])

quiz = set.objectEnumerator()


pickQuestion()


func shuffledQuiz(_ name: [[NSArray]]) -> NSArray
if currentSetIndex < name.count 
    return name[currentSetIndex].shuffled() as NSArray

return NSArray()

func pickQuestion() 

if let quiz = quiz?.nextObject() as? NSArray 
    print(quiz)

    let questionLabel: [String] = quiz.value(forKeyPath: "question") as! NSArray as! [String]

    print(questionLabel)
    self.questionLabel.text = questionLabel.description

    let correctAnswer: [Int] = quiz.value(forKey: "Answer") as! NSArray as! [Int]
     print(correctAnswer)
    let answers = quiz.value(forKeyPath: "options") as! NSArray

   print(answers)


    for i in 0..<answersButtons.count 
        answersButtons[i].setTitle((answers[i] as AnyObject).localizedName, for: .normal)
    
    remainingQuestionsLabel.text = "\(set.index(of: quiz) + 1)/\(set.count)"

else 
    endOfQuestionsAlert()


我的plist如下

我将不胜感激这方面的任何帮助。谢谢。

【问题讨论】:

【参考方案1】:

使用Fisher-Yates 随机播放。

基本算法是:

    从您的未洗牌数组和一个空的洗牌数组开始。 从未洗牌的数组中随机选择一个元素 将其从未洗牌数组中移除,并将其添加到已洗牌数组的末尾。 重复第 2 步和第 3 步,直到未洗牌的数组为空。 返回打乱后的数组。

您可以使用以下算法“就地”打乱数组

    将变量 n 设置为数组中的元素数。 在0 ..&lt; n中选择一个随机数x(使用arc4random_uniform()) 将元素x 与元素n - 1 交换 从n 中减去1 重复步骤 2 到 4,直到 n 为零。

【讨论】:

以上是关于如何打乱问题并显示数组的一项的主要内容,如果未能解决你的问题,请参考以下文章

如何删除嵌套数组的一项? [复制]

如何打乱一组 UIViews

如何从 mongodb 查询和获取数组中的一项?

使用 ForEach SwiftUI Core Data 仅更改列表中的一项

如何在 Swift 中打乱数组?

如何使用 .InnerHTML 方法放置特定的数组项