【问题标题】:Swift - Adding value to an array inside a dictionarySwift - 向字典中的数组添加值
【发布时间】:2018-11-24 05:49:10
【问题描述】:

我有一个对象数组,我想根据学生 ID 将其存储在字典中。在我的字典中,我的键是字符串类型,值是字符串数组。如何在数组中附加值?

我的学生数组:

var studentArray = [Student(id: '1', subject: 'History'), Student(id: '2', subject: 'History'), Student(id:'1', subject: 'Maths')]

我的最终字典应该是这样的:

{'1': ['History', 'Maths'], '2': ['History']}

我的代码:

var dictionary = [String, [String]]()
for student in studentArray {
   dictionary.updateValue(student.subject, forKey: student.id)
}

这给了我输出:

{'1': ['Maths'], '2': ['History']}

我试过:dictionary[student.id].append([student.subject]) 但这给了我零输出。

如何将值附加到字典内的数组中?

【问题讨论】:

标签: arrays swift dictionary


【解决方案1】:

这里的每个人都过于复杂了。这个任务有一个专用的 API 哈哈

struct Student {
    let id: Int
    let subject: String
}

let students = [
    Student(id: 1, subject: "History"),
    Student(id: 2, subject: "History"),
    Student(id: 1, subject: "Maths")
]

let subjectsByStudentID = Dictionary
    .init(grouping: students, by: { $0.id })
    .mapValues { students in students.map { $0.subject } }

print(subjectsByStudentID) // => [2: ["History"], 1: ["History", "Maths"]]

【讨论】:

  • 太好了,我不知道那个 API。
【解决方案2】:

编辑:感谢 Martin 的评论。下面的 sn-p 是我能想到的最简洁的答案。我最初是从错误的方向来的。我遇到了一个错误。见 cmets

struct Student { 
    let id: Int
    let subject : String
}

var studentArray = [Student(id: 1, subject: "History"), Student(id: 2, subject: "History"), Student(id:1, subject: "Maths")]

typealias Subject = String
var dict : [Int: [Subject]] = [:]

for student in studentArray {

    (dict[student.id, default: []]).append(student.subject)
}

print(dict)

以前的答案:

struct Student { 
    let id: Int
    let subject : String
}

var studentArray = [Student(id: 1, subject: "History"), Student(id: 2, subject: "History"), Student(id:1, subject: "Maths")]

typealias Subject = String
var dict : [Int: [Subject]] = [:]

for student in studentArray {
    var subjects = dict[student.id] ?? [String]()
    subjects.append(student.subject)
    dict[student.id] = subjects
}

print(dict)

或者你可以这样做:

struct Student { 
    let id: Int
    let subject : String
}

var studentArray = [Student(id: 1, subject: "History"), Student(id: 2, subject: "History"), Student(id:1, subject: "Maths")]

typealias Subject = String
var dict : [Int: [Subject]] = [:]

for student in studentArray {
    if let _ = dict[student.id]{
        dict[student.id]!.append(student.subject)
    }else{
        dict[student.id] = [student.subject]
    }
}

print(dict)

随便你

【讨论】:

  • 他的代码无法编译。他正在使用'。它是一个整数。我只是假设自己。 typealias 只是为了提高可读性...
  • 更简单:dict[student.id, default: []].append(student.subject) - 比较stackoverflow.com/q/42486686/1187415
  • @MartinR 啊哈。这就是我想要做的。我在做(dict[student.id] ?? [String]()).append(student.subject),但没用。我收到以下错误:无法在不可变值上使用变异成员:'??' 返回不可变值。我不得不改变我的方法
  • let dict = students.reduce(into: [:]) { $0[$1.id, default: []].append($1.subject) }
【解决方案3】:

未经测试,但这应该可以:

var dictionary = [String: [String]]()

for student in studentArray {
    if dictionary[student.id] == nil {
        dictionary[student.id] = [String]()
    }
    dictionary[student.id]?.append(student.subject)
}

【讨论】:

  • dictionary[student.id]?nil
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
相关资源
最近更新 更多