【问题标题】:Swift iOS -How to sort array of individual objects into separated arrays based on similar propertySwift iOS - 如何根据相似的属性将单个对象的数组排序为单独的数组
【发布时间】:2017-03-04 12:43:43
【问题描述】:

我有一个array超级英雄 对象。我想根据name property 将超级英雄分组到separated arrays 中,然后计算每个人separated array 中有多少对象

对象:

class SuperHero{
    var name: String?
    var power: Bool?
}

超级英雄数组(可以有无限个超级英雄)

var superHeroes = [SuperHero]()

let superHero1 = SuperHero()
superHero1.name = "SuperMan"
superHero1.power = true

superHeroes.append(superHero1)

let superHero2 = SuperHero()
superHero2.name = "BatMan"
superHero2.power = true

superHeroes.append(superHero2)

let superHero3 = SuperHero()
superHero3.name = "BatMan"
superHero3.power = true

superHeroes.append(superHero3)

let superHero4 = SuperHero()
superHero4.name = "SuperMan"
superHero4.power = true

superHeroes.append(superHero4)

//etc...

使用名称属性排序:

let sortedHeros = superHeroes.sort{$0.name < $1.name}
for hero in sortedHeros{
    print(hero.name)
    /*
    prints
    BatMan
    BatMan
    SuperMan
    SuperMan
    */
}

如何将排序后的数组放入单独的数组中,然后打印每个单独数组的计数?

//this is what I want
separatedArraysOfSuperHeroes = [[superHero2, superHero3], [superHero1, superHero4]]

//subscriprting isn't ideal because i'll never know the exact number of separated arrays
print(separatedArraysOfSuperHeroes[0].count)
print(separatedArraysOfSuperHeroes[1].count)

根据 cmets,我想要子数组的原因是因为我想使用它们来填充不同的 tableview 部分。对于即在我的表格视图中,我现在将有 2 个部分。第一部分会有一个标题,上面写着“蝙蝠侠”,里面有 2 个蝙蝠侠对象,第二部分有一个标题,上面写着超人,里面有 2 个超人对象。 count 属性将显示每个部分内的超级英雄对象的数量。

【问题讨论】:

  • 使用superHeroes.map 创建一个超级英雄名称数组,然后将该数组放入 NSCountedSet。工作完成
  • 您说您希望输出为 [[superHero2, superHero3], [superHero1, superHero4]] 这是一个数组数组,其中您在第一个子数组中有 2 个来自排序数组的元素,然后在第二个子数组中有 2 个其他元素-大批。为什么?除了对你的超级英雄对象进行任意分组之外,这种结构是什么意思?如果您想要一个通用的解决方案,您需要笼统地描述您的目标,而不是给出一个示例数据集和一个示例结果。这些信息不足以让我们推断您想要使用的过程以获得结果。
  • 从你的问题的第一部分,我想你会希望你的输出是[name1, name2, name3, name4][power1, power2, power3, power4] (一个排序的名称数组和一个排序的超级英雄对象的功率值数组) .但是你所说的期望输出对我来说没有任何意义。
  • 请编辑您的问题以明确说明您的目标。事实上,我们必须猜测。

标签: ios arrays swift sorting filter


【解决方案1】:
func getSeparatedArrayBasedOnName(superHeroes: [SuperHero]) -> [[SuperHero]] {

    guard let superNames = NSOrderedSet.init(array: superHeroes.map { $0.name ?? "" }).array as? [String] else {
        print("Something went wrong with conversion")
        return [[SuperHero]]()
    }

    var filteredArray = [[SuperHero]]()

    for superName in superNames {
        let innerArray = superHeroes.filter({ return $0.name == superName })
        filteredArray.append(innerArray)
    }

    for array in filteredArray {
        for hero in array {
            print(hero.name ?? "")
        }
    }

    return filteredArray
}

【讨论】:

  • 假设您对 OP 所需的输出(按超级英雄名称分组的数组数组)是正确的,那么您的答案就是一个好答案。但是,我对 OP 的目标没有你那么清楚,我希望听到他清晰连贯地陈述这个目标。
  • @Ravi Aggarwal 谢谢,我稍后会尝试并告诉你
  • @RaviAggarwal 3 年后这对我仍然有效 :)
猜你喜欢
  • 2013-01-19
  • 1970-01-01
  • 2021-02-04
  • 2018-07-30
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多