将值放入具有相同值的数组中

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 将具有相同类型的字典分组到具有完整键和值的数组中

JavaScript 将数组中具有相同值的对象 取出组成新的数组

在 1D NumPy 数组中查找值的索引/位置(具有相同的值)[重复]