在 Swift 中对数组进行分组和排序

Rub*_*ben 5 arrays sorting swift

假设我有这段代码:

class Stat {
   var statEvents : [StatEvents] = []
}

struct StatEvents {
   var name: String
   var date: String
   var hours: Int
}

var currentStat = Stat()

currentStat.statEvents = [
   StatEvents(name: "lunch", date: "01-01-2015", hours: 1),
   StatEvents(name: "dinner", date: "02-01-2015", hours: 2),
   StatEvents(name: "dinner", date: "03-01-2015", hours: 3),
   StatEvents(name: "lunch", date: "04-01-2015", hours: 4),
   StatEvents(name: "dinner", date: "05-01-2015", hours: 5),
   StatEvents(name: "breakfast", date: "06-01-2015", hours: 6),
   StatEvents(name: "lunch", date: "07-01-2015", hours: 7),
   StatEvents(name: "breakfast", date: "08-01-2015", hours: 8)
]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法获得具有如下输出的数组:

- [0]
  - name : "lunch"
  - date
    - [0] : "01-01-2015"
    - [1] : "04-01-2015"
    - [2] : "07-01-2015"
  - hours
    - [0] : 1
    - [1] : 4
    - [2] : 7     
- [1]
  - name : "dinner"
  - date
    - [0] : "02-01-2015"
    - [1] : "03-01-2015"
    - [2] : "05-01-2015"
  - hours
    - [0] : 2
    - [1] : 3   
    - [2] : 5          
- [2]
  - name : "breakfast"
  - date
    - [0] : "06-01-2015"
    - [1] : "08-01-2015"
  - hours
    - [0] : 6
    - [1] : 8 
Run Code Online (Sandbox Code Playgroud)

如您所见,最终数组应按“名称”后代进行分组。@oisdk 你能检查一下吗?

Flo*_*rer 1

最终结果的类型为 [[String : AnyObject]],或者您创建一个新的 structtype 来保存这些值,结果的类型为 [String : NewStructType]:

struct NewStructType
{ 
    var dates: [String]?
    var hours: [Int]?
}
Run Code Online (Sandbox Code Playgroud)

因此,您必须做出决定,然后必须编写自己的函数来对 StatEvents 对象进行排序和分组。也许您可以优化其性能,但这是如何实现第二个版本(使用 NewStructType)的第一个想法:

var result = [String : NewStructType]()

for statEvent in currentStat.statEvents
{
    if (result[statEvent.name] != nil)
    {
        var newStructType = result[statEvent.name]!

        newStructType.dates.append(statEvent.date)
        newStructType.hours.append(statEvent.hours)
    }
    else
    {
        result[statEvent.name] = NewStructType(dates: [statEvent.date], hours: [statEvent.hours])
    }
}
Run Code Online (Sandbox Code Playgroud)