优化下面这段代码:List<Map<String,Object>> list = new ArrayList<>(); for (int i = 0; i < personDist.length; i++) { if (list.size() == kpiScoreSummary.size()){ break; } int j = personDist[i]; int size = list.size(); for (int x = size; x < size + j; x++) { Map<String, Object> map = kpiScoreSummary.get(x); double actualScoreD = (double) map.get("ACTUALSCORE"); if (actualScoreD >= 90 && i == 0){ map.put("lev","1.1"); }else if (actualScoreD >= 80 && i == 1){ map.put("lev","1"); }else if (actualScoreD >= 70 && i == 2){ map.put("lev","0.9"); }else if (actualScoreD >= 60 && i == 3){ map.put("lev","0.8"); }else { map.put("lev","0.7"); } list.add(map); } }
时间: 2024-01-11 13:05:19 浏览: 112
这段代码的主要性能瓶颈在于循环嵌套中的内部循环,每次循环都要从集合中取出元素,进行判断和修改操作,导致了时间复杂度较高。以下是一些可能的优化建议:
1. 将列表遍历的操作放到外部循环中:将遍历列表的操作放到外部循环中,可以减少内部循环的次数。具体来说,可以将变量 size 移到外部循环之前,这样内部循环只需要遍历 size ~ size+j-1 这个范围即可。
2. 预先筛选出符合条件的元素:由于每次循环都需要判断元素是否符合条件,这个操作可以在循环之前进行,将符合条件的元素以及对应的等级保存到一个 Map 中,然后在循环中直接取出即可,这样可以减少循环中的判断操作。
3. 使用基本数据类型:对于变量 i、j、size 等,可以使用基本数据类型 int,而不是 Integer 类型,这样可以减少自动装箱和拆箱操作。
下面是优化后的代码:
```
List<Map<String,Object>> list = new ArrayList<>();
int size = 0;
Map<Double, String> levelMap = new HashMap<>();
levelMap.put(90.0, "1.1");
levelMap.put(80.0, "1");
levelMap.put(70.0, "0.9");
levelMap.put(60.0, "0.8");
double[] thresholds = {90.0, 80.0, 70.0, 60.0};
for (int i = 0; i < personDist.length && list.size() < kpiScoreSummary.size(); i++) {
int j = personDist[i];
size += j;
for (int x = size - j; x < size && list.size() < kpiScoreSummary.size(); x++) {
Map<String, Object> map = kpiScoreSummary.get(x);
double actualScoreD = (double) map.get("ACTUALSCORE");
String level = "0.7";
for (int k = 0; k < thresholds.length; k++) {
if (actualScoreD >= thresholds[k] && i == k) {
level = levelMap.get(thresholds[k]);
break;
}
}
map.put("lev", level);
list.add(map);
}
}
```
优化后的代码中,通过预先将符合条件的等级保存到 Map 中,减少了循环中的判断操作;将列表遍历的操作放到外部循环中,减少了内部循环的次数;使用基本数据类型,避免了自动装箱和拆箱操作。
阅读全文