「Swift コントロールブレーク Map Reduce」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==Swift コントロールブレーク Map Reduce== Java Category:ロジック Category:アルゴリズム Java キーブレーク コントロール…」) |
|||
2行目: | 2行目: | ||
[[Java]] [[Category:ロジック]] [[Category:アルゴリズム]] | [[Java]] [[Category:ロジック]] [[Category:アルゴリズム]] | ||
− | [[Java キーブレーク コントロールブレーク]] | + | *[[Java キーブレーク コントロールブレーク]] |
+ | |||
+ | ===コントロールブレーク=== | ||
+ | <pre> | ||
+ | func setData() { | ||
+ | let start = Calendar.current.date(byAdding:.day, value: -15, to: Date()) | ||
+ | let end = Date() | ||
+ | let predicate = HKQuery.predicateForSamples(withStart: start, end: end) | ||
+ | let sampleType = HKQuantityType.quantityType(forIdentifier: .bodyMass)! | ||
+ | |||
+ | let query = HKSampleQuery( | ||
+ | sampleType: sampleType, | ||
+ | predicate: predicate, | ||
+ | limit: HKObjectQueryNoLimit, | ||
+ | sortDescriptors: nil) { | ||
+ | (query, results, error) in | ||
+ | |||
+ | var samples = (results as! [HKQuantitySample]).makeIterator() | ||
+ | |||
+ | var data:Dictionary<String, (high:Double, low:Double, open:Double, close:Double)> = [:] | ||
+ | |||
+ | let formatter = DateFormatter() | ||
+ | formatter.dateFormat = "yy/M/d" | ||
+ | |||
+ | var item = samples.next() | ||
+ | if item != nil { | ||
+ | var key1:String? = formatter.string(from: item!.startDate) | ||
+ | while item != nil { | ||
+ | // 日付単位 | ||
+ | var isFind = false | ||
+ | var isFirst = true | ||
+ | var open:Double? | ||
+ | var close:Double? | ||
+ | var bm:Double? | ||
+ | var high:Double? | ||
+ | var low:Double? | ||
+ | while item != nil && key1 == formatter.string(from: item!.startDate) { | ||
+ | isFind = true | ||
+ | bm = item!.quantity.doubleValue(for: .gram()) / 1000 | ||
+ | |||
+ | if isFirst { | ||
+ | open = bm | ||
+ | high = bm | ||
+ | low = bm | ||
+ | isFirst = false | ||
+ | } | ||
+ | if bm! > high! { | ||
+ | high = bm | ||
+ | } | ||
+ | if bm! < low! { | ||
+ | low = bm | ||
+ | } | ||
+ | print("\(key1!) BM:\(bm!) OPEN:\(open!) HIGH:\(high!) LOW:\(low!) ") | ||
+ | item = samples.next() | ||
+ | } | ||
+ | close = bm | ||
+ | |||
+ | if isFind { | ||
+ | // 要素を辞書に格納 | ||
+ | data[key1!] = (high:high!, low:low!, open:open!, close:close!) | ||
+ | } | ||
+ | if item != nil { | ||
+ | key1 = formatter.string(from: item!.startDate) | ||
+ | } | ||
+ | print("BREAK") | ||
+ | } | ||
+ | } | ||
+ | |||
+ | var yValues: [CandleChartDataEntry] = [] | ||
+ | var xValues: [String] = [] | ||
+ | var x = 0 | ||
+ | var current = start! | ||
+ | |||
+ | while current <= end { | ||
+ | let key = formatter.string(from: current) | ||
+ | |||
+ | var de: CandleChartDataEntry? | ||
+ | if let ds = data[key] { | ||
+ | de = CandleChartDataEntry(x: Double(x), shadowH: ds.high, shadowL: ds.low, open: ds.open, close: ds.close) | ||
+ | } else { | ||
+ | de = CandleChartDataEntry(x: Double(x), shadowH: 0.0, shadowL: 0.0, open: 0.0, close: 0.0) | ||
+ | } | ||
+ | |||
+ | yValues.append(de!) | ||
+ | xValues.append(key) | ||
+ | |||
+ | current = Calendar.current.date(byAdding: .day, value:1, to: current)! | ||
+ | x += 1 | ||
+ | |||
+ | print("KEY:\(key) CURRENT:\(String(describing:current)) START:\(String(describing:start)) END:\(String(describing:end)) DE:\(String(describing:de))") | ||
+ | print("COMPARE:\(current <= end)") | ||
+ | } | ||
+ | |||
+ | DispatchQueue.main.async { | ||
+ | self.chart.xAxis.valueFormatter = IndexAxisValueFormatter(values: xValues) | ||
+ | let set = CandleChartDataSet(entries: yValues, label: "bodymass") | ||
+ | set.valueFont = UIFont(name: "HelveticaNeue-Light", size: 10)! | ||
+ | set.drawValuesEnabled = true | ||
+ | |||
+ | let data = CandleChartData(dataSet: set) | ||
+ | self.chart.data = data | ||
+ | } | ||
+ | } | ||
+ | self.healthStore?.execute(query) | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ===Map Reduceで書き直し=== | ||
+ | <pre> | ||
+ | func setData() { | ||
+ | let start = Calendar.current.date(byAdding:.day, value: -15, to: Date()) | ||
+ | let end = Date() | ||
+ | let predicate = HKQuery.predicateForSamples(withStart: start, end: end) | ||
+ | let sampleType = HKQuantityType.quantityType(forIdentifier: .bodyMass)! | ||
+ | |||
+ | let query = HKSampleQuery( | ||
+ | sampleType: sampleType, | ||
+ | predicate: predicate, | ||
+ | limit: HKObjectQueryNoLimit, | ||
+ | sortDescriptors: nil) { | ||
+ | (query, results, error) in | ||
+ | |||
+ | let formatter = DateFormatter() | ||
+ | formatter.dateFormat = "yy/M/d" | ||
+ | |||
+ | let samples = (results as! [HKQuantitySample]) | ||
+ | |||
+ | var dtGrp:Dictionary<String, [Double]> = [:] | ||
+ | |||
+ | // 日付グループ化 | ||
+ | print("--- グループ化 Date:BM ---") | ||
+ | let _ = samples.map { sample in | ||
+ | let key = formatter.string(from: sample.startDate) | ||
+ | let bm = sample.quantity.doubleValue(for: .gram()) / 1000 | ||
+ | |||
+ | var list = dtGrp[key] | ||
+ | if list == nil { | ||
+ | list = [] | ||
+ | } | ||
+ | list!.append(bm) | ||
+ | dtGrp[key] = list | ||
+ | print("key:\(key) value:\(bm)") | ||
+ | } | ||
+ | |||
+ | // 集計 | ||
+ | print("--- 集計 ---") | ||
+ | var dtEnt:Dictionary<String, (high:Double, low:Double, open:Double, close:Double)> = [:] | ||
+ | dtGrp.keys.forEach { key in | ||
+ | |||
+ | let list = dtGrp[key]! | ||
+ | |||
+ | let open = list.first! | ||
+ | let close = list.last! | ||
+ | let high = list.reduce(open) { (bm1, bm2) -> Double in | ||
+ | return bm1 > bm2 ? bm1 : bm2 | ||
+ | } | ||
+ | let low = list.reduce(open) { (bm1, bm2) -> Double in | ||
+ | return bm1 < bm2 ? bm1 : bm2 | ||
+ | } | ||
+ | dtEnt[key] = (high:high, low:low, open:open, close:close) | ||
+ | print("key:\(key) open:\(open) close:\(close) high:\(high) low:\(low)") | ||
+ | } | ||
+ | |||
+ | var yValues: [CandleChartDataEntry] = [] | ||
+ | var xValues: [String] = [] | ||
+ | var x = 0 | ||
+ | var current = start! | ||
+ | |||
+ | while current <= end { | ||
+ | let key = formatter.string(from: current) | ||
+ | |||
+ | var de: CandleChartDataEntry? | ||
+ | if let ds = dtEnt[key] { | ||
+ | de = CandleChartDataEntry(x: Double(x), shadowH: ds.high, shadowL: ds.low, open: ds.open, close: ds.close) | ||
+ | } else { | ||
+ | de = CandleChartDataEntry(x: Double(x), shadowH: 0.0, shadowL: 0.0, open: 0.0, close: 0.0) | ||
+ | } | ||
+ | |||
+ | yValues.append(de!) | ||
+ | xValues.append(key) | ||
+ | |||
+ | current = Calendar.current.date(byAdding: .day, value:1, to: current)! | ||
+ | x += 1 | ||
+ | |||
+ | print("KEY:\(key) CURRENT:\(String(describing:current)) START:\(String(describing:start)) END:\(String(describing:end)) DE:\(String(describing:de))") | ||
+ | print("COMPARE:\(current <= end)") | ||
+ | } | ||
+ | |||
+ | DispatchQueue.main.async { | ||
+ | self.chart.xAxis.valueFormatter = IndexAxisValueFormatter(values: xValues) | ||
+ | let set = CandleChartDataSet(entries: yValues, label: "bodymass") | ||
+ | set.valueFont = UIFont(name: "HelveticaNeue-Light", size: 10)! | ||
+ | set.drawValuesEnabled = true | ||
+ | |||
+ | let data = CandleChartData(dataSet: set) | ||
+ | self.chart.data = data | ||
+ | } | ||
+ | } | ||
+ | self.healthStore?.execute(query) | ||
+ | } | ||
+ | </pre> |
2022年6月19日 (日) 02:20時点における最新版
Swift コントロールブレーク Map Reduce
コントロールブレーク
func setData() { let start = Calendar.current.date(byAdding:.day, value: -15, to: Date()) let end = Date() let predicate = HKQuery.predicateForSamples(withStart: start, end: end) let sampleType = HKQuantityType.quantityType(forIdentifier: .bodyMass)! let query = HKSampleQuery( sampleType: sampleType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { (query, results, error) in var samples = (results as! [HKQuantitySample]).makeIterator() var data:Dictionary<String, (high:Double, low:Double, open:Double, close:Double)> = [:] let formatter = DateFormatter() formatter.dateFormat = "yy/M/d" var item = samples.next() if item != nil { var key1:String? = formatter.string(from: item!.startDate) while item != nil { // 日付単位 var isFind = false var isFirst = true var open:Double? var close:Double? var bm:Double? var high:Double? var low:Double? while item != nil && key1 == formatter.string(from: item!.startDate) { isFind = true bm = item!.quantity.doubleValue(for: .gram()) / 1000 if isFirst { open = bm high = bm low = bm isFirst = false } if bm! > high! { high = bm } if bm! < low! { low = bm } print("\(key1!) BM:\(bm!) OPEN:\(open!) HIGH:\(high!) LOW:\(low!) ") item = samples.next() } close = bm if isFind { // 要素を辞書に格納 data[key1!] = (high:high!, low:low!, open:open!, close:close!) } if item != nil { key1 = formatter.string(from: item!.startDate) } print("BREAK") } } var yValues: [CandleChartDataEntry] = [] var xValues: [String] = [] var x = 0 var current = start! while current <= end { let key = formatter.string(from: current) var de: CandleChartDataEntry? if let ds = data[key] { de = CandleChartDataEntry(x: Double(x), shadowH: ds.high, shadowL: ds.low, open: ds.open, close: ds.close) } else { de = CandleChartDataEntry(x: Double(x), shadowH: 0.0, shadowL: 0.0, open: 0.0, close: 0.0) } yValues.append(de!) xValues.append(key) current = Calendar.current.date(byAdding: .day, value:1, to: current)! x += 1 print("KEY:\(key) CURRENT:\(String(describing:current)) START:\(String(describing:start)) END:\(String(describing:end)) DE:\(String(describing:de))") print("COMPARE:\(current <= end)") } DispatchQueue.main.async { self.chart.xAxis.valueFormatter = IndexAxisValueFormatter(values: xValues) let set = CandleChartDataSet(entries: yValues, label: "bodymass") set.valueFont = UIFont(name: "HelveticaNeue-Light", size: 10)! set.drawValuesEnabled = true let data = CandleChartData(dataSet: set) self.chart.data = data } } self.healthStore?.execute(query) }
Map Reduceで書き直し
func setData() { let start = Calendar.current.date(byAdding:.day, value: -15, to: Date()) let end = Date() let predicate = HKQuery.predicateForSamples(withStart: start, end: end) let sampleType = HKQuantityType.quantityType(forIdentifier: .bodyMass)! let query = HKSampleQuery( sampleType: sampleType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { (query, results, error) in let formatter = DateFormatter() formatter.dateFormat = "yy/M/d" let samples = (results as! [HKQuantitySample]) var dtGrp:Dictionary<String, [Double]> = [:] // 日付グループ化 print("--- グループ化 Date:BM ---") let _ = samples.map { sample in let key = formatter.string(from: sample.startDate) let bm = sample.quantity.doubleValue(for: .gram()) / 1000 var list = dtGrp[key] if list == nil { list = [] } list!.append(bm) dtGrp[key] = list print("key:\(key) value:\(bm)") } // 集計 print("--- 集計 ---") var dtEnt:Dictionary<String, (high:Double, low:Double, open:Double, close:Double)> = [:] dtGrp.keys.forEach { key in let list = dtGrp[key]! let open = list.first! let close = list.last! let high = list.reduce(open) { (bm1, bm2) -> Double in return bm1 > bm2 ? bm1 : bm2 } let low = list.reduce(open) { (bm1, bm2) -> Double in return bm1 < bm2 ? bm1 : bm2 } dtEnt[key] = (high:high, low:low, open:open, close:close) print("key:\(key) open:\(open) close:\(close) high:\(high) low:\(low)") } var yValues: [CandleChartDataEntry] = [] var xValues: [String] = [] var x = 0 var current = start! while current <= end { let key = formatter.string(from: current) var de: CandleChartDataEntry? if let ds = dtEnt[key] { de = CandleChartDataEntry(x: Double(x), shadowH: ds.high, shadowL: ds.low, open: ds.open, close: ds.close) } else { de = CandleChartDataEntry(x: Double(x), shadowH: 0.0, shadowL: 0.0, open: 0.0, close: 0.0) } yValues.append(de!) xValues.append(key) current = Calendar.current.date(byAdding: .day, value:1, to: current)! x += 1 print("KEY:\(key) CURRENT:\(String(describing:current)) START:\(String(describing:start)) END:\(String(describing:end)) DE:\(String(describing:de))") print("COMPARE:\(current <= end)") } DispatchQueue.main.async { self.chart.xAxis.valueFormatter = IndexAxisValueFormatter(values: xValues) let set = CandleChartDataSet(entries: yValues, label: "bodymass") set.valueFont = UIFont(name: "HelveticaNeue-Light", size: 10)! set.drawValuesEnabled = true let data = CandleChartData(dataSet: set) self.chart.data = data } } self.healthStore?.execute(query) }
© 2006 矢木浩人