List<Integer> topKeys = knowledgeProblemMap.entrySet().stream() .sorted(Comparator.comparingInt((Map.Entry<Integer, List<Integer>> entry) -> entry.getValue().size()) .thenComparing((a, b) -> DateUtil.dateAfterCompare(knowledgeCreateDateMap.get(a.getKey()), knowledgeCreateDateMap.get(b.getKey())) ? 1 : 0 ).reversed()) .limit(knowledgeCount) // 取前10个 .map(Map.Entry::getKey) .collect(Collectors.toList());
时间: 2024-03-04 11:48:25 浏览: 109
这段代码的作用是从一个包含知识点和问题列表的 Map 中,按照问题数量和知识点创建时间进行排序,取出前面排名靠前的若干个知识点,并将它们的键值(即知识点的 ID)存储在一个列表中返回。其中:
- `knowledgeProblemMap` 是一个包含知识点和问题列表的 Map;
- `knowledgeCreateDateMap` 是一个包含知识点创建时间的 Map;
- `knowledgeCount` 是需要取出的知识点数量。
相关问题
public List<String> bxGetExcelList(List<LightGroupReq> lightGroupReqs) { LinkedHashMap<Long, List<Frames>> groupingFrames = jsonToBinPub(lightGroupReqs,VehicleConstants.VEHICLE_X); ArrayList<String> writeBinList = new ArrayList<>(); Map<Integer, Frames> portMap = new HashMap<>(); List<Frames> frameList = new ArrayList<>(); for (int i = 1; i <= 78; i++) { frameList.add(new Frames(7, 63, 63, 2550, 15, 15, 0, i, 0, 2)); } groupingFrames.put((long) groupingFrames.size(), frameList); long timeStamp = 0; for (Map.Entry<Long, List<Frames>> entry : groupingFrames.entrySet()) { List<Frames> framesList = entry.getValue(); int[] temp = new int[79]; //全部初始化为-1 Arrays.fill(temp, -1); for (int i = 0; i < framesList.size(); i++) { temp[framesList.get(i).getGroupIndex()] = 1; } // 补充FF 数据帧 for (int i = 1; i < temp.length; i++) { if (temp[i] == -1) { portMap.put(i, new Frames(7, 63, 63, 2550, 15, 15, 0, i, 0, 2)); } } framesList.addAll(portMap.values()); framesList = framesList.stream().sorted(Comparator.comparing(Frames::getGroupIndex)).collect(Collectors.toList()); portMap.clear(); if(timeStamp>7){ timeStamp = 0; } for (int j = 0; j < framesList.size(); j++) { BinaryFileUtils.bxFramesToHex(framesList.get(j),timeStamp,writeBinList); } timeStamp++; } return writeBinList; }优化这段代码
1. 在for循环中创建的Frames对象可以提取出来,避免重复创建对象,提高效率。
2. 可以将填充-1的数组temp改为使用HashSet或LinkedHashSet,避免重复遍历数组。
3. 可以使用Lambda表达式代替for循环中的操作,简化代码。
4. 可以使用Map的computeIfAbsent方法避免重复判断key是否存在。
重构后的代码如下:
```
public List<String> bxGetExcelList(List<LightGroupReq> lightGroupReqs) {
LinkedHashMap<Long, List<Frames>> groupingFrames = jsonToBinPub(lightGroupReqs,VehicleConstants.VEHICLE_X);
ArrayList<String> writeBinList = new ArrayList<>();
Map<Integer, Frames> portMap = new HashMap<>();
List<Frames> frameList = new ArrayList<>();
for (int i = 1; i <= 78; i++) {
frameList.add(new Frames(7, 63, 63, 2550, 15, 15, 0, i, 0, 2));
}
groupingFrames.put((long) groupingFrames.size(), frameList);
long timeStamp = 0;
for (Map.Entry<Long, List<Frames>> entry : groupingFrames.entrySet()) {
List<Frames> framesList = entry.getValue();
Set<Integer> groupIndexSet = new HashSet<>();
framesList.forEach(f -> groupIndexSet.add(f.getGroupIndex()));
// 补充FF 数据帧
groupIndexSet.stream()
.filter(i -> !framesList.stream().anyMatch(f -> f.getGroupIndex() == i))
.forEach(i -> portMap.computeIfAbsent(i, k -> new Frames(7, 63, 63, 2550, 15, 15, 0, k, 0, 2)));
framesList.addAll(portMap.values());
framesList.sort(Comparator.comparing(Frames::getGroupIndex));
portMap.clear();
if (timeStamp > 7) {
timeStamp = 0;
}
framesList.forEach(f -> BinaryFileUtils.bxFramesToHex(f, timeStamp, writeBinList));
timeStamp++;
}
return writeBinList;
}
```
在java中,定义一个Map<String, Integer>,由键值进行降序排序,最后由结果的键生成一个List<String>
可以使用Java 8的Stream API和Comparator来实现该功能,具体代码如下:
```java
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("a", 3);
map.put("b", 1);
map.put("c", 2);
List<String> result = map.entrySet()
.stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.map(Map.Entry::getKey)
.collect(Collectors.toList());
System.out.println(result); // 输出 [a, c, b]
}
}
```
首先使用`entrySet()`方法将Map中的键值对转换为Set集合,再通过`stream()`方法将集合转换为流。然后调用`sorted()`方法,传入一个降序排列的比较器,即`Collections.reverseOrder(Map.Entry.comparingByValue())`,根据值进行降序排序。之后调用`map()`方法,将每个Entry对象转换为其键,最后使用`collect()`方法将结果转换为List集合。
阅读全文