Arrays 结构内部结构均衡计数重复项Swift
我找到的答案是一级结构。在我的代码中,我想知道结构的内部有多少相同的日期。我以前从未使用equatable,所以我不知道如何在struct中使用struct实现它 我使用的是Charts pod,数组Arrays 结构内部结构均衡计数重复项Swift,arrays,swift,struct,swift5,equatable,Arrays,Swift,Struct,Swift5,Equatable,我找到的答案是一级结构。在我的代码中,我想知道结构的内部有多少相同的日期。我以前从未使用equatable,所以我不知道如何在struct中使用struct实现它 我使用的是Charts pod,数组chartMetricItemSets包含多天的不同读数。例如:[“名称”:糖,[[“日期”:“10月10日”,“价值”:120],“日期”:“10月10日”,“价值”:121],“日期”:“10月11日”,“价值”:120],“日期”:“10月13日”,“价值”:120],“日期”:“10月13日
chartMetricItemSets
包含多天的不同读数。例如:[“名称”:糖,[[“日期”:“10月10日”,“价值”:120],“日期”:“10月10日”,“价值”:121],“日期”:“10月11日”,“价值”:120],“日期”:“10月13日”,“价值”:120],“日期”:“10月13日”,“价值”:121]
。xaxisdate
将是[“10月10日”,“10月11日”,“10月13日”]
x代表日期,y代表同一日期
目标:chartDataEntries应该附加[x:0(10/10),y:241],[x:1(10/11),y:120],[x:2(10/13),y:241]
谢谢大家!
struct ChartData {
let name: String
let value: [ChartValue]
}
struct ChartValue {
let date: Date
let value: Double
}
var chartMetricItemSets = [[ChartData]]()
var xAxisDates = [String]() //date array
func getChartDataSets() {
for (index, chartHealthItemSet) in chartMetricItemSets.enumerated() {
let dataSourceSelected = dataSourcesSelected[index]
var chartDataEntries = [ChartDataEntry]() //array display on graph
var chartYaxis: Double = 0
var datePoint: Int = 0
var countChartYaxis = 0
var duplicateDateCount = 0
for (index, item) in chartHealthItemSet[0].value.enumerated() {
for (dateIndex, date) in xAxisDates.enumerated() {
if item.date.convertDateToString(dateFormat: .monthDay) == date {
chartYaxis += item.value
datePoint = dateIndex
chartYaxis += 1
break
}
//missing counting duplicateDateCount
if duplicateDateCount == countChartYaxis {
chartDataEntries.append(ChartDataEntry(x: Double(datePoint), y: chartYaxis.roundUpNDecimal(n: 2)))
}
}
print("chartYaxis: \(chartYaxis)")
print("chartDataEntries: \(chartDataEntries)")
}
chartDataEntries.sort(by: { $0.x < $1.x })
let set = LineChartDataSet(entries: chartDataEntries,
label: HEALTH_TABLE.allCases[dataSourceSelected].info.name)
set.mode = .linear // cubic line effect (smoother)
set.colors = [HEALTH_TABLE.allCases[dataSourceSelected].info.chartColor]
set.setCircleColor(.black)
set.lineWidth = 1.5
set.circleRadius = 3
set.drawCircleHoleEnabled = false
set.drawCirclesEnabled = true
set.drawHorizontalHighlightIndicatorEnabled = true
lineChartData?.addDataSet(set)
}
chartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: xAxisDates)
chartView.xAxis.granularity = 1
chartView.xAxis.axisMinLabels = 4
chartView.xAxis.axisMaxLabels = 6
DispatchQueue.main.async {
self.chartView.data = self.lineChartData
}
}
结构图表数据{
let name:String
let value:[图表值]
}
结构图表值{
日期:日期
让值加倍
}
var chartMetricItemSets=[[ChartData]]()
var xAxisDates=[String]()//日期数组
func getChartDataSets(){
对于chartMetricItemSets.enumerated()中的(索引,chartHealthItemSet){
让dataSourceSelected=dataSourceSelected[index]
var chartDataEntries=[ChartDataEntry]()//数组显示在图形上
变量chartYaxis:Double=0
变量日期点:Int=0
var countChartYaxis=0
var duplicateDateCount=0
对于chartHealthItemSet[0]中的(索引,项)。值。枚举(){
对于xAxisDates.enumerated()中的(dateIndex,date){
如果item.date.convertDateToString(日期格式:.monthDay)=日期{
chartYaxis+=项值
datePoint=dateIndex
chartYaxis+=1
打破
}
//缺少计数重复日期计数
如果duplicateDateCount==countChartYaxis{
append(ChartDataEntry(x:Double(datePoint),y:chartYaxis.roundUpNDecimal(n:2)))
}
}
打印(“chartYaxis:\(chartYaxis)”)
打印(“chartDataEntries:\(chartDataEntries)”)
}
排序(按:{$0.x<$1.x})
设为set=LineChartDataSet(条目:chartDataEntries,
标签:HEALTH_TABLE.allCases[dataSourceSelected].info.name)
set.mode=.linear//立方线效果(更平滑)
set.colors=[HEALTH_TABLE.allCases[dataSourceSelected].info.chartColor]
set.setCircleColor(.black)
set.lineWidth=1.5
set.circleRadius=3
set.drawCircleHoleEnabled=false
set.drawCircleEnabled=true
set.drawHorizontalHighlightIndicatorEnabled=true
lineChartData?.addDataSet(集)
}
chartView.xAxis.valueFormatter=索引xaxisValueFormatter(值:xAxisDates)
chartView.xAxis.granularity=1
chartView.xAxis.axisMinLabels=4
chartView.xAxis.axisMaxLabels=6
DispatchQueue.main.async{
self.chartView.data=self.lineChartData
}
}
在Swift 4中,引入了一个有用的API,通过任意谓词将数组分组到字典中 您可以分组
chartHealthItemSet[0]
let grouped = Dictionary(grouping: chartHealthItemSet[0], by: {$0.date.convertDateToString(dateFormat: .monthDay)}
结果是[“10/10”:[ChartData],“10/11”:[ChartData],…]
对键进行排序并将其分配给xAxisDates
xAxisDates = grouped.keys.sorted()
要获取值的总和,请从日期键的分组字典中获取数组,将其映射到值并求和
for (index, date) in xAxisDates.enumerated() {
let sum = grouped[date]!.map{$0.value}.reduce{0.0, +}
chartDataEntries.append(ChartDataEntry(x: Double(index), y: sum.roundUpNDecimal(n: 2)))
}
您好!谢谢您的回答,但当我键入第一行时,出现了“表达式类型不明确,没有更多上下文”错误。让分组=…我知道了!更改一点后:)非常感谢!!