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

时间:2015-01-03 18:52:14

标签: arrays swift

我对swift很新,我正在使用collectionview开发应用程序。我喜欢在同一部分中订购具有相同标签的所有图像。所以我必须有带有相同标签的图像的数组。 具有以下值的示例主数组:

  • 带有标记a
  • 的Image1
  • 带有标签b
  • 的Image2
  • 图片3,标签为b
  • 带有标记a的图像
  • 带标签c
  • 的Image5
  • ...

结果我喜欢有以下数组:一个带标签a,一个带标签b,依此类推。

我找到了一个函数(感谢stackoverflow)从主数组中获取所有不同的值。我已经将它用于了多个部分。它如下:

 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 个答案:

答案 0 :(得分: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不同,您不必明确要求它。< / p>