给定一个值数组,我如何将它分成由相等元素组成的子数组
?
给定这个数组
let numbers = [1, 1, 1, 3, 3, 4]
我想要这个输出
[[1,1,1], [3, 3], [4]]
解决这一问题的一种可能方法是创建某种索引,以指示每个元素的出现情况。
let indexes = [1:3, 3:2, 4:1]
最后使用索引重建输出数组。
let subsequences = indexes.sort { $0.0.0 < $0.1.0 }.reduce([Int]()) { (res, elm) -> [Int] in
return res + [Int](count: elm.1, repeatedValue: elm.0)
}
但是,使用此解决方案,我会丢失原始值。当然,在这种情况下,这不是一个大问题(一个Int
值仍然存在,即使重新创建,Int
),但我想将此解决方案应用于像这样更复杂的数据结构
struct Starship: Equatable {
let name: String
let warpSpeed: Int
}
func ==(left:Starship, right:Starship) -> Bool {
return left.warpSpeed == right.warpSpeed
}
实际上,我正在寻找的函数是与flatte()
相反的函数
let subsequences: [[Int]] = [[1,1,1], [3, 3], [4]]
print(Array(subsequences.flatten())) // [1, 1, 1, 3, 3, 4]
我希望我已经说清楚了,如果你需要更多的细节,请告诉我。
假设您有一个未排序的项目数组。您将需要对初始数组进行排序,然后您将得到如下内容:[1,1,1,3,3,4]
之后,您将初始化两个数组:一个用于存储数组,另一个用于将其用作当前数组。
循环遍历初始数组并执行以下操作:
希望有帮助!
如果您可以使用CocoaPods/Carthage/Swift Package Manager/等。您可以使用类似oisdk/SwiftSequence的包,它提供了group()
方法:
numbers.lazy.group()
// should return a sequence that generates [1, 1, 1], [3, 3], [4].
或UsrNameu1/TraverSwift,它提供了groupBy
:
groupBy(SequenceOf(numbers), ==)
如果不想添加外部依赖项,可以编写如下算法:
func group<S: SequenceType where S.Generator.Element: Equatable>(seq: S) -> [[S.Generator.Element]] {
var result: [[S.Generator.Element]] = []
var current: [S.Generator.Element] = []
for element in seq {
if current.isEmpty || element == current[0] {
current.append(element)
} else {
result.append(current)
current = [element]
}
}
result.append(current)
return result
}
group(numbers)
// returns [[1, 1, 1], [3, 3], [4]].
// extract unique numbers using a set, then
// map sub-arrays of the original arrays with a filter on each distinct number
let numbers = [1, 1, 1, 3, 3, 4]
let numberGroups = Set(numbers).map{ value in return numbers.filter{$0==value} }
print(numberGroups)
[编辑]更改为使用Hamish建议的设置初始值设定项
[EDIT2]Swift 4在字典中添加了一个初始化器,可以更有效地执行此操作:
let numberGroups = Array(Dictionary(grouping:numbers){$0}.values)
对于要按其属性之一分组的对象列表:
let objectGroups = Array(Dictionary(grouping:objects){$0.property}.values)
问题内容: 说我在这里有一个字符串: 我想在空白处分割字符串并将值分配给它们各自的变量 此外,有时用户可能没有姓氏。 问题答案: Swift的方法是使用全局函数,如下所示: 与 Swift 2 在Swift 2中,由于引入了内部CharacterView类型,对split的使用变得更加复杂。这意味着String不再采用SequenceType或CollectionType协议,而必须使用该属性来访
问题内容: 想象一下,我有一个这样的JS数组: 我想要的是将该数组拆分为N个较小的数组。例如: 对于Python,我有这个: 对于JS,我可以提出的最佳解决方案是递归函数,但我不喜欢它,因为它既复杂又丑陋。这个内部函数返回一个像这样的数组[1,2,3,null,4,5,6,null,7,8],然后我必须再次循环并手动拆分它。(我的第一次尝试是返回此:[1、2、3,[4、5、6,[7、8、9]]],
问题内容: 假设我有一个如下所示的Javascript数组: 什么方法适合将数组分块(拆分)为更小的数组,最多可以有10个元素? 问题答案: 该array.slice方法可以从一开始,中间,或自己需要的任何目的数组的结束提取切片,在不改变原来的数组。
问题内容: 运行此查询时: 我得到一个这样的表: 我现在想做的是获取相同的信息,但是将数组分成几行,所以我得到的结果是这样的: 如您所见,我不想在“ selected_placements”中获取具有空值的行。 我正在使用PostgreSQL 8.0.2。 非常感谢! 问题答案: 我建议您升级Postgres版本。所有受支持的版本均支持: 在早期版本中,您可以尝试一次将它们选出来。尽管已在9.5中
问题内容: 我试图将一个Int拆分为其各个数字,例如3489到3 4 8 9,然后我要将这些数字放入一个Int数组中。 我已经尝试过将数字放入字符串中,然后遍历每个数字,但是它不起作用: 有任何想法吗? 问题答案: 我们还可以扩展StringProtocol并创建一个计算属性: 编辑/更新: Xcode 11•Swift 5.1 在 Swift 5中, 我们现在可以使用新属性
我想检查是否可以将一个数组拆分为具有相同和的连续子数组。拆分数组还意味着删除数组的边框元素。 例如,要将其拆分为3个部分,我们需要删除到元素 通过删除这2个元素,就有3个相同和的连续子数组,和。 因此,如果可以将数组拆分为3个部分(等和)并删除它们之间的边界,则应返回true,否则应返回false。 返回的示例是。因为删除2个元素后,它将有4个元素,这些元素不能分组为3个相等的和 我不知道如何处理