我有一个matches(50)
列表,我需要从中提取一个FlSpot()
值,该值需要一个X
和Y
作为parameter(doubles)
,但是,我的图形仅在X方向上接受10个值,因此,为了解决这个问题,我添加了一个for循环,该循环删除了多余的匹配项,并且仅返回10个匹配项,但是for循环引发错误。
我试图通过for循环进行调整,但无济于事。
double calculateOneKDR(Matches match) {
int totalKills = 0;
int totalMatches = 0;
totalKills += match.kills;
totalMatches += match.matches;
return num.parse((totalKills / totalMatches).toStringAsFixed(2));
}
List<FlSpot> calculateGraphDots(String playlist) {
List<FlSpot> output = [];
List<Matches> matches = _matches;
List<Matches> validMatches = [];
int extraLength = 0;
matches.forEach(
(match) {
if (match.playlist == playlist) {
validMatches.add(match);
}
},
);
if (validMatches.length > 10) {
extraLength = validMatches.length - 10;
}
for (var i = 0; i < extraLength; i++) {
validMatches.removeAt(i); //error point
}
List<double> matchkdrs = [];
validMatches.forEach(
(match) {
matchkdrs.add(
calculateOneKDR(match),
);
},
);
for (var i = 0; i < validMatches.length; i++) {
output.add(
FlSpot(
double.parse('$i'),
matchkdrs[i],
),
);
}
return [...output];
}
它应返回长度为10的List<FlSpot>
,但有时会引发该错误,
E/flutter (15859): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: RangeError (index): Invalid value: Not in range 0..13, inclusive: 14
E/flutter (15859): #0 List.[] (dart:core-patch/growable_array.dart:147:60)
E/flutter (15859): #1 List.removeAt (dart:core-patch/growable_array.dart:28:22)
E/flutter (15859): #2 PlayerStats.getMaxY
package:fortbuddy/providers/player_stats.dart:237
E/flutter (15859): #3 _ItemShopScreenState.initState.<anonymous closure>
package:fortbuddy/screens/item_shop_screen.dart:33
E/flutter (15859): #4 new Future.delayed.<anonymous closure> (dart:async/future.dart:316:39)
E/flutter (15859): #5 _rootRun (dart:async/zone.dart:1120:38)
E/flutter (15859): #6 _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter (15859): #7 _CustomZone.runGuarded (dart:async/zone.dart:923:7)```
答案 0 :(得分:0)
每次删除removeAt(i)
时,向量的其余部分都会向上移动,因此现在更短了。
因此,一段时间后,删除操作将结束。
您需要每次都删除相同的索引,或者从后部开始-或使用不同于每次删除一个索引并每次向上移动其余索引的方法,这效率很低。阅读erase
。
答案 1 :(得分:0)
您可以使用sublist
方法。 https://api.dartlang.org/stable/2.6.0/dart-core/List/sublist.html
因此,您可以这样编写if语句
if (validMatches.length > 10) {
validMatches = validMatches.sublist(0, 10);
}
并且您不再需要