2016-11-04 75 views
0

比方說,我有一個這樣的數組:[1,4,7,4,2,2,4,7,1,2]用相同的元素將數組分成小數組

我需要劃分這個陣列與相同的元件陣列,使其顯示在迅速的結果作爲這樣的功能:

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

如何在swift中做到這一點?在此先感謝

+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]] 

或者,利用一般Sequence擴展,分類部分,如在線程接受的答案被@Hamish掛描述:

例如:

/* 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],[盲人],[as],[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) 

據我所知,沒有原生Swift等效的NSCountedSet呢。

相關問題