|
@@ -40,6 +40,7 @@ import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.ParseException;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.slibra.common.constant.MyConstants.*;
|
|
|
import static com.slibra.common.enums.BusinessEnum.BigModelWarningTypeRemarkEnum.*;
|
|
@@ -1626,80 +1627,8 @@ public class AsyncTask {
|
|
|
noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
}
|
|
|
|
|
|
- //出水总磷超标报警
|
|
|
- BigDecimal csTp = tXinyiIndustry.getCsTp();
|
|
|
- warningMoreExceed = handleXinYiWarningsCsMore(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
- if(warningMoreExceed.isBreakpoint()){
|
|
|
- breakpointCount++;
|
|
|
- breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
- }
|
|
|
- if(warningMoreExceed.isNoChange()){
|
|
|
- noChange++;
|
|
|
- noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //出水总氮超标报警
|
|
|
- BigDecimal csTn = tXinyiIndustry.getCsTn();
|
|
|
- warningMoreExceed = handleXinYiWarningsCsMore(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
- if(warningMoreExceed.isBreakpoint()){
|
|
|
- breakpointCount++;
|
|
|
- breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
- }
|
|
|
- if(warningMoreExceed.isNoChange()){
|
|
|
- noChange++;
|
|
|
- noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
-
|
|
|
- //出水氨氮超标报警
|
|
|
- BigDecimal csNh3 = tXinyiIndustry.getCsNh3();
|
|
|
- warningMoreExceed = handleXinYiWarningsCsMore(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
- if(warningMoreExceed.isBreakpoint()){
|
|
|
- breakpointCount++;
|
|
|
- breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
- }
|
|
|
- if(warningMoreExceed.isNoChange()){
|
|
|
- noChange++;
|
|
|
- noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
-
|
|
|
- //出水SS超标报警
|
|
|
- BigDecimal csSS = tXinyiIndustry.getCsSs();
|
|
|
- warningMoreExceed = handleXinYiWarningsCsMore(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
|
|
|
- if(warningMoreExceed.isBreakpoint()){
|
|
|
- breakpointCount++;
|
|
|
- breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
- }
|
|
|
- if(warningMoreExceed.isNoChange()){
|
|
|
- noChange++;
|
|
|
- noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
//进水相关报警
|
|
|
- //进水总磷超标报警
|
|
|
- BigDecimal jsTp = tXinyiIndustry.getJsTp();
|
|
|
- warningMoreExceed = handleXinYiWarningRecordJSMore(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
- if(warningMoreExceed.isBreakpoint()){
|
|
|
- breakpointCount++;
|
|
|
- breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
- }
|
|
|
- if(warningMoreExceed.isNoChange()){
|
|
|
- noChange++;
|
|
|
- noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
-
|
|
|
- //进水COD超标报警
|
|
|
- BigDecimal jsCod = tXinyiIndustry.getJsCod();
|
|
|
- warningMoreExceed = handleXinYiWarningRecordJSMore(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
|
|
|
- if(warningMoreExceed.isBreakpoint()){
|
|
|
- breakpointCount++;
|
|
|
- breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
- }
|
|
|
- if(warningMoreExceed.isNoChange()){
|
|
|
- noChange++;
|
|
|
- noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
|
|
|
//进水总氮超标报警
|
|
|
BigDecimal jsTn = tXinyiIndustry.getJsTn();
|
|
@@ -1725,17 +1654,6 @@ public class AsyncTask {
|
|
|
noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
}
|
|
|
|
|
|
- //进水SS超标报警
|
|
|
- BigDecimal jsSS = tXinyiIndustry.getJsSs();
|
|
|
- warningMoreExceed = handleXinYiWarningRecordJSMore(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
|
|
|
- if(warningMoreExceed.isBreakpoint()){
|
|
|
- breakpointCount++;
|
|
|
- breakPointList.add(warningMoreExceed.getBreakPointWarningRecord());
|
|
|
- }
|
|
|
- if(warningMoreExceed.isNoChange()){
|
|
|
- noChange++;
|
|
|
- noChangeList.add(warningMoreExceed.getNoChangeWarningRecord());
|
|
|
- }
|
|
|
|
|
|
Date nowDate = DateUtils.getNowDate();
|
|
|
//下面是处理多个指标的 【断点】和 连续不变的报警
|
|
@@ -1810,28 +1728,6 @@ public class AsyncTask {
|
|
|
}
|
|
|
}
|
|
|
}else{
|
|
|
- //将其他类型的报警全部关闭
|
|
|
- //2025年02月27日17:09:56 此场景不关闭其他报警
|
|
|
-// closeOtherWarningsBySymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
|
|
|
- //再新增新的类型的报警
|
|
|
- /*if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
|
- //插入该类型报警
|
|
|
- warningRecord.setType(0);
|
|
|
- String msg = BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getMsg();
|
|
|
- warningRecord.setCategory(msg);
|
|
|
- warningRecord.setTime(nowDate);
|
|
|
- warningRecord.setReason(msg);
|
|
|
- warningRecord.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_DD_MORE_GYK.getCode());
|
|
|
- warningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
- warningRecord.setCreateTime(nowDate);
|
|
|
- this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecord);
|
|
|
- //同时处理决策 不用调用大模型,本地处理问答
|
|
|
- addChatRecordByBreakPointsMore(warningRecord, tXinyiIndustry, normConfig);
|
|
|
- }else{
|
|
|
- log.info("工业库报警的时候,发现存在仪表故障(断点多个指标)的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
- }
|
|
|
- log.info("工业库报警的时候,发现存在仪表故障(断点多个指标)的报警,其他报警不再处理");
|
|
|
- return;*/
|
|
|
//逻辑调整:要按指标报多指标断点 需要当前的集合和原来的集合判断,新的报警增加,如果之前有了报警则不处理
|
|
|
if(CollectionUtils.isEmpty(tXinyiWarningRecords)){
|
|
|
//新增的断点的数据全部都报警
|
|
@@ -2027,28 +1923,6 @@ public class AsyncTask {
|
|
|
}
|
|
|
}
|
|
|
}else{
|
|
|
- //将其他类型的报警全部关闭
|
|
|
- //2025年02月27日17:09:56 此场景不关闭其他报警
|
|
|
-// closeOtherWarningsBySymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
|
|
|
- //触发 多个连续不变报警
|
|
|
- /*if(CollectionUtils.isEmpty(tXinyiWarningNoChangeMoreRecords)){
|
|
|
- //插入该类型报警
|
|
|
- warningRecordNoChangeMore.setType(0);
|
|
|
- String msg = BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getMsg();
|
|
|
- warningRecordNoChangeMore.setCategory(msg);
|
|
|
- warningRecordNoChangeMore.setTime(nowDate);
|
|
|
- warningRecordNoChangeMore.setReason(msg);
|
|
|
- warningRecordNoChangeMore.setSymbol(BusinessEnum.WarningSymbolEnum.YBGZ_LX_MORE.getCode());
|
|
|
- warningRecordNoChangeMore.setCreateBy(WARNING_DEFAULT_CREATE);
|
|
|
- warningRecordNoChangeMore.setCreateTime(nowDate);
|
|
|
- this.xinyiWarningRecordMapper.insertTXinyiWarningRecord(warningRecordNoChangeMore);
|
|
|
- //同时处理决策 不用调用大模型,本地处理问答
|
|
|
- addChatRecordByNoChangeMore(warningRecordNoChangeMore, tXinyiIndustry, normConfig);
|
|
|
- }else{
|
|
|
- log.info("工业库报警的时候,发现存在仪表故障(连续不变多个指标)的报警,并且已经有该类型报警了,不做任何处理");
|
|
|
- }
|
|
|
- log.info("发现存在仪表故障(连续不变多个指标)的报警,其他报警不再处理");
|
|
|
- return;*/
|
|
|
//逻辑调整:要按指标报多指标断点 需要当前的集合和原来的集合判断,新的报警增加,如果之前有了报警则不处理
|
|
|
if(CollectionUtils.isEmpty(tXinyiWarningNoChangeMoreRecords)){
|
|
|
//新增的断点的数据全部都报警
|
|
@@ -2178,52 +2052,13 @@ public class AsyncTask {
|
|
|
|
|
|
//开始走正常的水质报警 + 突变
|
|
|
//2025年02月27日15:33:39 加上校验:此次的检查指标必须是不存在断点且不存在连续不变才执行下面的报警。
|
|
|
-
|
|
|
- //没有断点,且没有连续不变,全部执行
|
|
|
- /*if(breakpointCount < 1 && noChange < 1){
|
|
|
- handleXinYiWarningsCsOrigin(cscodBzz, csCod, cscodGkz, CS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
|
|
|
- handleXinYiWarningsCsOrigin(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
- handleXinYiWarningsCsOrigin(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
- handleXinYiWarningsCsOrigin(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
- handleXinYiWarningsCsOrigin(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
|
|
|
- handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
- handleXinYiWarningRecordJSOrigin(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
|
|
|
- handleXinYiWarningRecordJSOrigin(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
- handleXinYiWarningRecordJSOrigin(jsadSjz, jsNh3, BusinessEnum.WarningCategoryEnum.JS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
- handleXinYiWarningRecordJSOrigin(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
|
|
|
- }*/
|
|
|
- //如果只有单一的报警,只有该指标不再进行报警,其他的指标还是要报警的
|
|
|
- /*if(breakpointCount == 1 && noChange == 0){//只有断点
|
|
|
- }
|
|
|
- if(breakpointCount == 0 && noChange == 1){//只有连续不变
|
|
|
- }
|
|
|
- if(breakpointCount == 1 && noChange == 1){//既有断点,又有连续不变 【可能是相同的指标,也可能是不同的指标】
|
|
|
- }*/
|
|
|
- //综合上面3中情况,断点和连续不变的,2个报警类型至少有一个报警,且只能有一个指标报警
|
|
|
- //上述逻辑存在bug:如果是不同的指标 比如出水cod断点 出水ss连续不变 则无法处理。 所以决定进出水的指标是否报警,需要每个知道都要单独记录,只要存在异常项就不能再走 异常升高/偏低/普通的报警了
|
|
|
-
|
|
|
//后续的指标是否往下进行,用新的逻辑:
|
|
|
if(csCodExecute && !Objects.isNull(cscodBzz) && cscodBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(cscodGkz) && cscodGkz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
handleXinYiWarningsCsOrigin(cscodBzz, csCod, cscodGkz, CS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
|
|
|
- if(csZLExecute && !Objects.isNull(cszlBzz) && cszlBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(cszlGkz) && cszlGkz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningsCsOrigin(cszlBzz, csTp, cszlGkz, BusinessEnum.WarningCategoryEnum.CS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
- if(csZDExecute && !Objects.isNull(cszzBzz) && cszzBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(cszzGkz) && cszzGkz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningsCsOrigin(cszzBzz, csTn, cszzGkz, BusinessEnum.WarningCategoryEnum.CS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
- if(csADExecute && !Objects.isNull(csadBzz) && csadBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(csadGkz) && csadGkz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningsCsOrigin(csadBzz, csNh3, csadGkz, BusinessEnum.WarningCategoryEnum.CS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
- if(csSSExecute && !Objects.isNull(csSSBzz) && csSSBzz.compareTo(BigDecimal.ZERO) > 0 && !Objects.isNull(csssGkz) && csssGkz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningsCsOrigin(csSSBzz, csSS, csssGkz, BusinessEnum.WarningCategoryEnum.CS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
|
|
|
- if(jsZLExecute && !Objects.isNull(jszlSjz) && jszlSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningRecordJSOrigin(jszlSjz, jsTp, BusinessEnum.WarningCategoryEnum.JS_ZL.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTp(), jsslSjz, normConfig.getJszlSjz()));
|
|
|
- if(jsCodExecute && !Objects.isNull(jscodSjz) && jscodSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningRecordJSOrigin(jscodSjz, jsCod, BusinessEnum.WarningCategoryEnum.JS_COD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsCod(), jsslSjz, normConfig.getJscodSjz()));
|
|
|
if(jsZDExecute && !Objects.isNull(jszdSjz) && jszdSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
handleXinYiWarningRecordJSOrigin(jszdSjz, jsTn, BusinessEnum.WarningCategoryEnum.JS_ZD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsTn(), jsslSjz, normConfig.getJszdSjz()));
|
|
|
if(jsADExecute && !Objects.isNull(jsadSjz) && jsadSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
handleXinYiWarningRecordJSOrigin(jsadSjz, jsNh3, BusinessEnum.WarningCategoryEnum.JS_AD.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsNh3(), jsslSjz, normConfig.getJsadSjz()));
|
|
|
- if(jsSSExecute && !Objects.isNull(jsSSSjz) && jsSSSjz.compareTo(BigDecimal.ZERO) > 0)
|
|
|
- handleXinYiWarningRecordJSOrigin(jsSSSjz, jsSS, BusinessEnum.WarningCategoryEnum.JS_SS.getCode(), tXinyiIndustry, normConfig, getCwrwfhzByDetail(jsSlq, tXinyiIndustry.getJsSs(), jsslSjz, normConfig.getJsssSjz()));
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|
|
@@ -5142,6 +4977,73 @@ public class AsyncTask {
|
|
|
// System.out.println(BigDecimal.valueOf(1).subtract(null));
|
|
|
String s = "asd@@@1dsa@@@1111@@@1222".replaceAll("@@@1", "!");
|
|
|
System.out.println(s);
|
|
|
+
|
|
|
+ List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape");
|
|
|
+
|
|
|
+ // 默认分组(使用HashMap,无顺序保证)
|
|
|
+ Map<Integer, List<String>> lengthMap = words.stream()
|
|
|
+ .collect(Collectors.groupingBy(String::length));
|
|
|
+
|
|
|
+ System.out.println("默认分组(顺序不确定):");
|
|
|
+ lengthMap.forEach((k, v) -> System.out.println(k + ": " + v));
|
|
|
+
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ // 按键自然顺序排序(升序)
|
|
|
+ Map<Integer, List<String>> sortedMap = words.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ String::length,
|
|
|
+ TreeMap::new, // 使用TreeMap自动按键排序
|
|
|
+ Collectors.toList()
|
|
|
+ ));
|
|
|
+
|
|
|
+ System.out.println("\n按键自然顺序排序(升序):");
|
|
|
+ sortedMap.forEach((k, v) -> System.out.println(k + ": " + v));
|
|
|
+
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ // 按键反转排序(降序)
|
|
|
+ Map<Integer, List<String>> reversedMap = words.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ String::length,
|
|
|
+ () -> new TreeMap<>(Comparator.reverseOrder()), // 使用反转比较器
|
|
|
+ Collectors.toList()
|
|
|
+ ));
|
|
|
+
|
|
|
+ System.out.println("\n按键反转排序(降序):");
|
|
|
+ reversedMap.forEach((k, v) -> System.out.println(k + ": " + v));
|
|
|
+
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ // 保持插入顺序
|
|
|
+ Map<Integer, List<String>> orderedMap = words.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ String::length,
|
|
|
+ LinkedHashMap::new, // 使用LinkedHashMap保持插入顺序
|
|
|
+ Collectors.toList()
|
|
|
+ ));
|
|
|
+
|
|
|
+ System.out.println("\n保持插入顺序:");
|
|
|
+ orderedMap.forEach((k, v) -> System.out.println(k + ": " + v));
|
|
|
+
|
|
|
+ System.out.println();
|
|
|
+
|
|
|
+ // 对已有结果按键排序
|
|
|
+ Map<Integer, List<String>> groupedMap = words.stream()
|
|
|
+ .collect(Collectors.groupingBy(String::length));
|
|
|
+
|
|
|
+ Map<Integer, List<String>> sortedAfter = new TreeMap<>(groupedMap);
|
|
|
+
|
|
|
+ System.out.println("\n对已有分组结果按键排序(升序):");
|
|
|
+ sortedAfter.forEach((k, v) -> System.out.println(k + ": " + v));
|
|
|
+
|
|
|
+ // 对已有结果按键反转排序
|
|
|
+ Map<Integer, List<String>> reversedAfter = new TreeMap<>(Comparator.reverseOrder());
|
|
|
+ reversedAfter.putAll(groupedMap);
|
|
|
+
|
|
|
+ System.out.println("\n对已有分组结果按键反转排序(降序):");
|
|
|
+ reversedAfter.forEach((k, v) -> System.out.println(k + ": " + v));
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|