Arrays of Int arrays. Storing duplicates in order only
我需要为有序重复项(位于数组中)存储一个Int数组的数组。
例:
-
给定数组:
mainArray = [7, 7, 3, 2, 2, 2, 1, 7, 5, 5]
现在,我需要创建一个int Array的2D数组。
例:
1 2 3 4 5 6 7 8 | Array [][] = [ [7, 7], [3], [2, 2, 2], [1], [7], [5, 5] ] |
这是我所拥有的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | for var i = 0; i < val.count; i++ { var columnArray = Array<Int>() for var j in 0...9 { if oldNum == val[j]{ columnArray.append(val[j]) } else { array.append(columnArray); //j += 1 break; } oldNum = val[j]; j += 1 } } |
您可以使用
1 2 3 4 5 6 7 8 | let result = numbers.reduce([[Int]]()) { (var result, num) -> [[Int]] in if var lastSequence = result.last where lastSequence.first == num { result[result.count-1].append(num) } else { result.append([num]) } return result } |
还原如何工作?
然后将其再次应用于上一次迭代的结果和第二个整数数组...等等。
关闭会发生什么?
否则,将仅包含新整数的新数组添加到结果中。
测试
1 | [[7, 7], [3], [2, 2, 2], [1], [7], [5, 5]] |
在元素相等的情况下扩展集合的另一种方法
1 2 3 4 5 6 7 8 9 10 11 12 13 | extension Collection where Element: Equatable { var grouped: [[Element]] { var result: [[Element]] = [] for element in self { if element == result.last?.last { result[result.index(before: result.endIndex)].append(element) } else { result.append([element]) } } return result } } |
1 2 3 | let array = [7, 7, 3, 2, 2, 2, 1, 7, 5, 5] array.grouped // [[7, 7], [3], [2, 2, 2], [1], [7], [5, 5]] |
这是我能想到的最无聊的迭代答案。另一方面,它很容易理解,并且不会像基于
1 2 3 4 5 6 7 8 9 10 11 12 13 | var result: [[Int]] = [] var inner: [Int] = [] for i in mainArray { if i == inner.last { inner.append(i) } else { result.append(inner) inner = [i] } } result.append(inner) // result == [[7, 7], [3], [2, 2, 2], [1], [7], [5, 5]] |
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | let mainArray = [7, 7, 3, 2, 2, 2, 1, 7, 5, 5] func filterTo2DArray(list: [Int] ) -> [[Int]] { var resultList = [[Int]]() list.forEach { x -> () in if let lastValue = resultList.last?.last where lastValue == x { resultList[resultList.count - 1].append(x) } else{ resultList.append([x]) } } return resultList } let t = filterTo2DArray(mainArray) //[[7, 7], [3], [2, 2, 2], [1], [7], [5, 5]] |
希望对您有所帮助。
以下代码将为您提供所需的信息...
1 2 3 4 5 6 7 8 9 10 11 12 | let mainArray = [7, 7, 3, 2, 2, 2, 1, 7, 5, 5] var newArray: [[Int]] = [] for var i=0; i < mainArray.count; i++ { let element = mainArray[i] if mainArray.indexOf(element) == i { var subArray = mainArray.filter({ $0 == element }) newArray.append(subArray) } } print(newArray) // -> [[7, 7, 7], [3], [2, 2, 2], [1], [5, 5]] |
这是一个编程逻辑问题。您当前的代码是完全错误的。
这是解决问题的一种方法:
通过对起始数组进行排序来开始。调用该inputArray。
创建新的空输出" outerArray"和" innerArray"变量。然后循环遍历inputArray中的条目,测试值的变化。如果该值与最后一个值相同,则将该值添加到" innerArray"。如果值已更改,则将以前的innerArray保存到externalArray并创建一个新的空数组,然后将其保存到innerArray。