2016-11-04 5 views
0

배열이 이런 식으로 있다고 가정 해 봅시다 : [1,4,7,4,2,2,4,7,1,2].같은 원소로 배열을 작은 배열로 나눕니다.

result = [[1,1],[4,4,4],[7,7],[2,2,2]] :

는 I는 신속한이 같은 결과를 도시하므로 동일한 요소 배열이 배열로 분할하는 기능을해야한다.

어떻게 신속하게 처리 할 수 ​​있습니까? 미리 감사드립니다

+1

[Swift에서 배열 요소로 그룹화하는 방법] (http://stackoverflow.com/questions/31220002/how-to-group-by-the-elements-of-an-array)을 살펴보십시오. -in-swift) - 그룹화 된 요소 사전을 생성합니다. 거기에서 그룹화 배열을 얻는 간단한 단계입니다. – Hamish

+0

@Hamish 문제가있는 경우, 그는 저녁 만 먹거나 발사하므로 filterArrays의 수를 알 수 있습니다. 그러나 필자의 경우 filterArrays의 수를 알지 못합니다. 그 배열은 단지 예제 일뿐입니다. –

+0

질문이 아니라 대답을보십시오. 대답은 여러 그룹으로 나뉩니다. – Hamish

답변

1

도우미 사전을 사용하여 배열의 값을 적절한 저장소로 분류 할 수 있습니다. 예 :

let arr = [1, 4, 7, 4, 2, 2, 4, 7, 1, 2] 
var dict: [Int: [Int]] = [:] 
arr.forEach { dict[$0] = (dict[$0] ?? []) + [$0] } 
let inBins = dict.map{ $1 }.sorted{ $0.first ?? 0 < $1.first ?? 0 } 
print(inBins) // [[1, 1], [2, 2, 2], [4, 4, 4], [7, 7]] 

또는 @Hamish에 링크 스레드에서 허용 대답에 설명 된대로 분류하는 부분에 대한 일반적인 Sequence 확장자를 사용합니다 :

예 :

/* from https://stackoverflow.com/a/39388832/4573247: 
    @mientus's Swift 3 translation of @oisdk's accepted answer */ 
public extension Sequence { 
    func categorise<U : Hashable>(_ key: (Iterator.Element) -> U) -> [U:[Iterator.Element]] { 
     var dict: [U:[Iterator.Element]] = [:] 
     for el in self { 
      let key = key(el) 
      if case nil = dict[key]?.append(el) { dict[key] = [el] } 
     } 
     return dict 
    } 
} 

let arr = [1, 4, 7 ,4, 2, 2, 4, 7, 1, 2] 
let inBins = arr.categorise{ $0 }.map{ $1 }.sorted{ $0.first ?? 0 < $1.first ?? 0 } 
print(inBins) // [[1, 1], [2, 2, 2], [4, 4, 4], [7, 7]] 

빈을 분류 할 필요가 없습니다 (위와 동일)? 두 옵션은 위의 다음 (단순히 마지막 sortin 부분을 삭제)로 감소됩니다

// ... first alternative above 
let inBins = dict.map{ $1 } 

// ... 2nd alternative above 
let inBins = arr.categorise{ $0 }.map{ $1 } 
+0

나는 * OP가 결과가 정렬되어야한다고 믿지 않는다는 것을 유의하십시오.) – Hamish

+0

@Hamish 아하 네가 맞아, 나는 첫 번째 요소 인 [[1, 1], [blind ], [for], [the], [rest]]', 감사합니다! – dfri

+0

고맙습니다. :) –

0

는 또 다른 옵션은 생성 될 수있는 NSCountedSet : 당신은 다음 쉽게 각각의 고유의 수를 얻을 수

let array = [1,4,7,4,2,2,4,7,1,2] 
let countedSet = NSCountedSet(array: array) 

요소 :

let countForOne = countedSet.count(for: 1) 

내가 아는 한 NSCountedSet의 기본 Swift 제품은 아직 없습니다.

관련 문제