当前位置: 首页 > 知识库问答 >
问题:

在Swift中将数组拆分为子数组

寿子轩
2023-03-14

给定一个值数组,我如何将它分成由相等元素组成的子数组

给定这个数组

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]

我希望我已经说清楚了,如果你需要更多的细节,请告诉我。

共有3个答案

公西志文
2023-03-14

假设您有一个未排序的项目数组。您将需要对初始数组进行排序,然后您将得到如下内容:[1,1,1,3,3,4]

之后,您将初始化两个数组:一个用于存储数组,另一个用于将其用作当前数组。

循环遍历初始数组并执行以下操作:

  • 如果当前值与上一个值没有不同,将其推送到当前数组
  • 否则将当前数组推到第一个数组,然后清空当前数组。

希望有帮助!

索曾琪
2023-03-14

如果您可以使用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]].
盛建德
2023-03-14
 // 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个相等的和 我不知道如何处理