2016-11-04 7 views
0

私は配列がこのようにあるとしましょう:[1,4,7,4,2,2,4,7,1,2]配列を同じ要素の小さな配列に分割する

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

私はそれが迅速にこのような結果を示しているように同じ要素を持つアレイにこの配列を分割する機能を必要とします。

どのように迅速に行うには?事前に感謝します

+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 ]、[として]、[の]、[その]、[休憩]] '、ありがとう! – 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のネイティブスウィフト相当品はまだありません。

関連する問題