2015-01-03 6 views
1

저는 꽤 재빨리 새로운 데 콜렉션 뷰를 사용하여 응용 프로그램에서 작업하고 있습니다. 같은 섹션에 같은 태그가있는 모든 이미지를 정렬하고 싶습니다. 그래서 같은 태그가있는 이미지가있는 배열을 가져야합니다. 다음 값 예 메인 어레이 : 동일한 값을 가진 배열에 값을 넣으십시오.

  • C 태그와 태그
  • 이미지 5와
  • 이미지 4 B 태그
  • 이미지 3 B 태그와 태그
  • 이미지 2와

    • 이미지 1. ..

    결과로 다음과 같은 배열이 있습니다. 태그 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

    당신이 원하는 것은 키가 태그 인과 배열이 해당 태그가 이미지 인 상태, 새 사전을 만들 것 같습니다 :이 제네릭 만들고 싶었다 경우

    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 반환 된 사전을 키에 사용되고 있다는 사실은 스위프트는 해쉬해야한다는 추론 할 수 있다는 것을 의미합니다, 그래서 당신은 명시 적으로 uniq와는 달리 그것을 필요가 없습니다.

    관련 문제