List<DynamicAuz> dynamicAuzs = allDynamicAuz.stream().filter(e -> currentWeight == e.getWeight()) .collect(Collectors.toList());
时间: 2024-04-19 18:27:20 浏览: 23
这行代码是用来从一个名为`allDynamicAuz`的列表中筛选出满足条件的元素,并将结果存储在另一个名为`dynamicAuzs`的列表中。条件是`currentWeight`等于元素的权重(通过`e.getWeight()`获取)。这个操作使用了Java 8中的流(Stream)和函数式编程的特性,并且使用了`filter()`方法和`collect()`方法来进行筛选和收集结果。最终的结果是一个符合条件的`DynamicAuz`对象列表。
相关问题
帮我解读一下这段代码:if (CollectionUtils.isEmpty(labelIds) || userId == null) { return new ArrayList<>(); } LambdaQueryWrapper<LabelInfoPO> labelQueryWrapper = new LambdaQueryWrapper<>(); labelQueryWrapper.eq(LabelInfoPO::getBusiness, LabelBusinessEnum.NEW_USER_INTEREST_LABEL.getCode()) .orderByAsc(LabelInfoPO::getWeight) ; List<LabelInfoPO> list = labelInfoMapper.selectList(labelQueryWrapper); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } Map<Long, LabelInfoPO> labelMap = list.stream().collect(Collectors.toMap(LabelInfoPO::getId, labelInfoPO -> labelInfoPO)); // 如果是选择标签然后提交的,需要保存用户选择记录 if (isSubmit) { for (Long labelId : labelIds) { if (!labelMap.containsKey(labelId)) { continue; } LabelRelPO labelRelPO = new LabelRelPO(); labelRelPO.setBusiness(LabelBusinessEnum.NEW_USER_LABEL_USER.getCode()); labelRelPO.setLabelId(labelId); labelRelPO.setRelId(userId); labelRelPO.setWeight(1); labelRelMapper.insert(labelRelPO); } } Set<Long> labelIdSet = list.stream().map(LabelInfoPO::getId).collect(Collectors.toSet()); LambdaQueryWrapper<LabelRelPO> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(LabelRelPO::getBusiness, LabelBusinessEnum.NEW_USER_LABEL_BOT.getCode()) .in(LabelRelPO::getLabelId, labelIdSet) ; List<LabelRelPO> labelRelList = labelRelMapper.selectList(queryWrapper); if (CollectionUtils.isEmpty(labelRelList)) { return new ArrayList<>(); } Set<Long> botIds = labelRelList.stream().map(LabelRelPO::getRelId).collect(Collectors.toSet()); List<BotInfoVO> botInfoList = botInfoService.selectByIds(botIds); if (CollectionUtils.isEmpty(botInfoList)) { return new ArrayList<>(); } Map<Long, BotInfoVO> botInfoMap = botInfoList.stream().collect(Collectors.toMap(BotInfoVO::getId, botInfoVO -> botInfoVO)); List<BotInfoVO> resultList = new ArrayList<>(); // 开始排序 按照两个order之和进行排序,不是用户选择的对order按照系数进行膨胀,这个系数可以根据实际情况再调整,目前来说这个是够了的 labelRelList.stream() .sorted(Comparator.comparingInt(e -> (labelMap.get(e.getLabelId()).getWeight() + e.getWeight()) * (labelIds.contains(e.getLabelId()) ? 1 : 10000))) .forEach(e -> { if (resultList.size() < 20 && botInfoMap.containsKey(e.getRelId())) { resultList.add(botInfoMap.get(e.getRelId())); } }); return resultList;
这段代码主要是根据一些条件查询并排序标签和机器人信息,并返回结果列表。
首先,代码检查了 `labelIds` 是否为空或者 `userId` 是否为空,如果是,则直接返回一个空列表 `new ArrayList<>()`。
接下来,使用 `LambdaQueryWrapper` 创建了一个查询条件 `labelQueryWrapper`,并设置了业务类型为 `NEW_USER_INTEREST_LABEL`,并按照权重进行升序排序。
然后,通过 `labelInfoMapper` 执行查询操作,将查询结果保存在 `list` 中。如果查询结果为空,则同样返回一个空列表。
接着,将 `list` 转换为一个 `Map` 对象 `labelMap`,以标签的 ID 作为键,标签对象 `LabelInfoPO` 作为值。
如果 `isSubmit` 为真,则进入一个循环遍历 `labelIds`。如果 `labelMap` 中包含当前遍历的标签 ID,则创建一个 `LabelRelPO` 对象,并设置相关属性,最后将其插入到数据库中。
然后,创建一个空的 `labelIdSet` 集合,并将 `list` 中的标签 ID 添加到集合中。
再使用 `LambdaQueryWrapper` 创建一个查询条件 `queryWrapper`,设置业务类型为 `NEW_USER_LABEL_BOT`,并且标签 ID 在 `labelIdSet` 集合中。
通过 `labelRelMapper` 执行查询操作,将查询结果保存在 `labelRelList` 中。如果查询结果为空,则同样返回一个空列表。
接着,从 `labelRelList` 中提取机器人 ID,并保存在 `botIds` 集合中。
使用 `botInfoService` 根据机器人 ID 进行批量查询,将查询结果保存在 `botInfoList` 中。如果查询结果为空,则同样返回一个空列表。
将 `botInfoList` 转换为一个 `Map` 对象 `botInfoMap`,以机器人的 ID 作为键,机器人对象 `BotInfoVO` 作为值。
创建一个空的 `resultList` 列表,然后对 `labelRelList` 进行排序。排序规则是根据标签的权重和关联权重的和进行排序,并且如果标签 ID 在 `labelIds` 中存在,则乘以一个较大的系数(1 * 10000),以便放置用户选择的标签更靠前。
最后,遍历排序后的 `labelRelList`,将对应的机器人对象添加到 `resultList` 中,直到 `resultList` 的大小达到 20 或遍历完所有的标签关联记录。
最终,返回排序后的机器人列表 `resultList`。
怎么修改这个算法double GetWeight(ALGraph G, int nStart, int nEnd, char cKind) { double dTorM = INFINITY*1.0; if (cKind == 'T' || cKind == 'M') { if (cKind == 'T') { ArcNode* pT = G.vertices[nStart].Firstarc; for (; pT != NULL; pT = pT->nextArc) { if (pT->nAdjvex == nEnd) { if (pT->Information.dTime < dTorM) dTorM = pT->Information.dTime; } } } else{ ArcNode* pM = G.vertices[nStart].Firstarc; for (; pM != NULL; pM = pM->nextArc) { if (pM->nAdjvex == nEnd) { if (pM->Information.dCost < dTorM) dTorM = pM->Information.dCost; } } } return dTorM; } else { cout << "Input error! Please enter T or M." << endl; cout << " If Time please enter T. If Money please enter M." << endl; cin >> cKind; return GetWeight(G, nStart, nEnd, cKind); } }
可以按照以下方式修改算法:
1. 在输入参数时,添加一个循环,直到用户输入的参数为'T'或'M'为止。如果用户输入的不是这两个字符,则输出错误信息并要求用户重新输入,直到输入正确为止。
2. 在计算最小权值时,将dTorM的初值设为无穷大,以确保最小权值的准确性。
3. 在遍历邻接表的过程中,先判断邻接表是否为空,如果为空,则直接返回无穷大。如果不为空,则继续遍历邻接表。
修改后的代码如下:
```c++
double GetWeight(ALGraph G, int nStart, int nEnd, char cKind) {
double dTorM = numeric_limits<double>::infinity();
while (cKind != 'T' && cKind != 'M') {
cout << "Input error! Please enter T or M." << endl;
cout << "If Time please enter T. If Money please enter M." << endl;
cin >> cKind;
}
if (cKind == 'T') {
ArcNode* pT = G.vertices[nStart].Firstarc;
if (pT == NULL) {
return dTorM;
}
for (; pT != NULL; pT = pT->nextArc) {
if (pT->nAdjvex == nEnd) {
if (pT->Information.dTime < dTorM) {
dTorM = pT->Information.dTime;
}
}
}
}
else if (cKind == 'M') {
ArcNode* pM = G.vertices[nStart].Firstarc;
if (pM == NULL) {
return dTorM;
}
for (; pM != NULL; pM = pM->nextArc) {
if (pM->nAdjvex == nEnd) {
if (pM->Information.dCost < dTorM) {
dTorM = pM->Information.dCost;
}
}
}
}
return dTorM;
}
```
阅读全文