2017-02-14 151 views
0
的另一個數組

比方說,我有報表對象的數組和GroupedReport對象 這是我的報告階層結構如何一組對象數組,轉化爲分組對象

class Report { 

    var report_date:String 
    var problem:String 
    var description:String 
    var is_know:Int 
    var is_solved:Int 

    init(report_date:String,problem:String,description:String,is_know:Int,is_solved:Int) { 
    self.report_date = report_date 
    self.problem = problem 
    self.description = description 
    self.is_know = is_know 
    self.is_solved = is_solved 
    } 
} 

這是我GroupedReport類結構

 class GroupedReport{ 
      var problem:String 
      var report_array:[Report] 

      init(problem:String){ 
       self.problem = problem 
       report_array = [] 
      } 

      public var description: String { return "GroupedReort:\nProblem:\(self 

    .problem)\nArray:\(self.report_array)" } 
} 

是否有任何算法將具有相同問題(報表類變量)的Report對象分組並將其轉換爲GroupedReport對象? 我已經完成了我自己的實現,我的代碼沒有按照我的預期工作。請有人幫助我嗎?感謝您的關注

  var reports:[Report] = [] 
      var problem_array:[String] = [] 
      var grouped_reports: [GroupedReport] = [] 
    func group_array(){ 
for i in 0...self.reports.count-1{ 
      print("\(i) Loop ::") 
      print("============") 
      var problem_found:Bool = false 
      // j loop start 
      if problem_array.count > 0 { 
      for j in 0...self.problem_array.count-1{ 
       print("problem_array[j]: \(problem_array[j]) <compare to> reports[i].problem: \(reports[i].problem)") 
       print("") 
       if(problem_array[j] == reports[i].problem){ 
        print("") 
        print("problem_array[j] \(problem_array[j]) <is equal to> reports[i].problem \(reports[i].problem)") 
        problem_found = true 
        // this is the existing problem 
       } 
      } 
      } 
      // j loop end 
      if(problem_found){ 
       //find problem key and append array to that key 
       for x in 0...self.grouped_reports.count-1{ 
        if self.grouped_reports[x].problem == reports[x].problem{ 
         print("") 
         print("Problem found") 
         print("Append Report problem :\(reports[x].problem)") 
         print("Append Report des :\(reports[x].description)") 
         self.grouped_reports[x].report_array.append(reports[x]) 
        } 
       } 
      } 
      else{ 
       // create new problem key 
       problem_array.append(reports[i].problem) 
       //crete new group_report with new problem and append current report[i] to that report , append that group_report to the group_report array 
       var group_report = GroupedReport(problem: reports[i].problem) 
       group_report.report_array.append(reports[i]) 
       print("") 
       print("new problem") 
        print("Append Report problem :\(reports[i].problem)") 
        print("Append Report des :\(reports[i].description)") 

       self.grouped_reports.append(group_report) 

      } 

     } 
      print("!!Final Array!!") 
      print("=================") 

      for i in 0...grouped_reports.count-1 { 
      print("\(i) Array!") 
      print("-----------") 
      print("Problem:\(self.grouped_reports[i].problem)") 
      print("Inner Array") 
      print("count: \(grouped_reports[i].report_array.count)") 
       for j in 0...grouped_reports[i].report_array.count-1{ 
       print(grouped_reports[i].report_array[j].description) 
       } 
      } 
    } 

回答

2

使用這樣的代碼來生成分組報告:

var groupedReports: [String: GroupedReport] = [:] 

reports.forEach { report in 
    if let groupedReport = groupedReports[report.problem] { 
     groupedReport.report_array.append(report) 
    } else { 
     let groupedReport = GroupedReport(problem: report.problem) 
     groupedReport.report_array.append(report) 
     groupedReports[report.problem] = groupedReport 
    } 
} 

然後你可以通過結果像這樣的循環:

for (problem, groupedReport) in groupedReports { 
    // do something with the groupedReport 
} 

更新

或者結果轉換爲數組是這樣的:

let grouped_reports = Array(groupedReports.values) 
+0

編輯追加,我在第一 – simonWasHere

+0

感謝sir..you代碼真的作品!錯過了斷一次線怎樣才能通過索引值訪問該字典。 (indexPath.row和indexPath.section)在我的表格視圖(viewForHeaderInSection方法和cellForRowAt indexPath方法)中顯示。感謝您的關注 –

+0

如果您喜歡數組中的結果以便輕鬆訪問,可以這樣編寫:let reportArray = Array (groupedReports.values) – simonWasHere