将值放入具有相同值的数组中
Posted
技术标签:
【中文标题】将值放入具有相同值的数组中【英文标题】:put values in arrays with identical values 【发布时间】:2015-01-03 18:52:13 【问题描述】:我对 swift 很陌生,我正在开发带有 collectionview 的应用程序。我喜欢在同一部分订购具有相同标签的所有图像。所以我必须有具有相同标签的图像的数组。 具有以下值的示例主数组:
带有标签 a 的 Image1 带有标签 b 的 Image2 带有标签 b 的 Image3 带有标签 a 的 Image4 带有标签 c 的 Image5 ...因此我喜欢有以下数组:一个带有标签 a 的数组和一个带有标签 b 的数组,依此类推。
我找到了一个函数(感谢 ***)来从主数组中获取所有不同的值。我已将其用于部分的数量。如下:
func uniq<S: SequenceType, E: Hashable where E==S.Generator.Element>(seq: S) -> [E]
var seen: [S.Generator.Element:Int] = [:]
return filter(seq) seen.updateValue(1, forKey: $0) == nil
我知道你必须通过主数组。 我一直在思考这个问题,但除了这个不起作用的代码之外,我找不到一个好的解决方案
var distinctArray=uniq(main_array)
//CREATE ARRAYS FOR ALL DISTINCT VALUES
for var index = 0; index < distinctArray.count; index++
var "\(distinctArray[index])" = []
//I KNOW THIS WILL NOT WORK BUT HOW DO YOU DO THIS, GIVE AN ARRAY A NAME OF A VALUE OF AN ARRAY?
//GOING THROUGH THE ARRAY AND ADD THE VALUE TO THE RIGHT ARRAY
for var index = 0; index < main_array.count; index++
for var index2 = 0; index2 < distinctArray.count; index2+=1
if main_array[index]==distinctArray[index2]
"\(distinctArray[index])".append(main_array[index])
谁能给我一个提示?也许我在以前的非工作代码上走错了路。
【问题讨论】:
【参考方案1】:看起来你想要的是创建一个新字典,键是标签,数组是带有该标签的图像:
struct Image
let name: String
let tag: String
let imageArray = [
Image(name: "Image1", tag: "a"),
Image(name: "Image2", tag: "b"),
Image(name: "Image3", tag: "b"),
Image(name: "Image4", tag: "a"),
Image(name: "Image5", tag: "c"),
]
func bucketImagesByTag(images: [Image]) -> [String:[Image]]
var buckets: [String:[Image]] = [:]
for image in images
// dictionaries and arrays being value types, this
// is unfortunately not as efficient as it might be...
buckets[image.tag] = (buckets[image.tag] ?? []) + [image]
return buckets
// will return a dictionary with a: and b: having
// arrays of two images, and c: a single image
bucketImagesByTag(imageArray)
如果您想使这个通用化,您可以编写一个接收集合的函数,以及一个识别存储桶的键的函数,并返回一个从键到元素数组的字典。
func bucketBy<S: SequenceType, T>(source: S, by: S.Generator.Element -> T) -> [T:[S.Generator.Element]]
var buckets: [T:[S.Generator.Element]] = [:]
for element in source
let key = by(element)
buckets[key] = (buckets[key] ?? []) + [element]
return buckets
// same as bucketImagesByTag above
bucketBy(imageArray) $0.tag
有趣的是,T
被用来作为返回字典的键,这意味着 Swift 可以推断它必须是可散列的,因此您不必像 uniq
那样明确要求它。
【讨论】:
以上是关于将值放入具有相同值的数组中的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift 将具有相同类型的字典分组到具有完整键和值的数组中