加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java.lang.IllegalStateException: Duplicate key 20

发布时间:2020-12-15 05:25:52 所属栏目:Java 来源:网络整理
导读:? 这个我在公司遇到的一个问题。原因: 使用MapString,String RelationMap = relation.stream().collect(Collectors.toMap(s - s[2],s - s[1],(oldValue,newValue) - newValue))) 转换过程中出现重复的Key。导致有多个value程序不知道应该取哪个的问题。 正

?

这个我在公司遇到的一个问题。原因:
使用Map<String,String> RelationMap = relation.stream().collect(Collectors.toMap(s -> s[2],s -> s[1],(oldValue,newValue) -> newValue)))
转换过程中出现重复的Key。导致有多个value程序不知道应该取哪个的问题。

正常案例

老师跟班级之间的关系,每一个老师都负责一个班级。

 1 @Data
 2 public class TeacherClass {
 3 
 4     /**主键ID*/
 5     private int id;
 6 
 7     /**教师ID*/
 8     private int teachId;
 9 
10     /**班级ID*/
11     private int classId;
12 
13     public TeacherClass(int id,int teachId,int classId) {
14         this.id = id;
15         this.teachId = teachId;
16         this.classId = classId;
17     }
18 }

?


老师与班级的关系

实际应用代码

 1 //查询所有老师负责的班级(一个老师对应一个班级)
 2         List<TeacherClass> list = new ArrayList<>(20);
 3         int count = 10;
 4         for (int i = 0; i < count; i++) {
 5             list.add(new TeacherClass(i,100 + i,200 + i));
 6         }
 7 
 8         //结果返回每个老师对应的班级ID
 9         Map<Integer,Integer> collect = list.stream().collect(Collectors.toMap(TeacherClass::getTeachId,TeacherClass::getClassId));
10         System.out.println("老师负责的班级ID:" + collect);

?



执行结果如下

显然是OK的

?

错误案例

假设这个时候程序出了一个bug,导致有一个老师负责两个班级。那么再执行之前的代码会有什么问题呢?

?

 1         //查询所有老师负责的班级(一个老师对应一个班级)
 2         List<TeacherClass> list = new ArrayList<>(20);
 3         int count = 10;
 4         for (int i = 0; i < count; i++) {
 5             list.add(new TeacherClass(i,200 + i));
 6         }
 7 
 8         //程序出了一个bug,导致有一个老师负责两个班级
 9         list.add(new TeacherClass(50,100,300));
10 
11         //结果返回每个老师对应的班级ID
12         Map<Integer,TeacherClass::getClassId));
13         System.out.println("老师负责的班级ID:" + collect);

?

?

执行结果如下

?

显然是有问题的。原因就是出现了重复的Key,那么怎么解决呢?
很简单,将Collectors.toMap(TeacherClass::getTeachId,TeacherClass::getClassId) 替换为Collectors.toMap(TeacherClass::getTeachId,TeacherClass::getClassId,(aLong,aLong2) -> aLong2 >= aLong ? aLong2 : aLong);

?

(aLong,aLong2) -> aLong2 >= aLong ? aLong2 : aLong表示的是出现重复Key的执行逻辑,如果出现重复Key取最大的value。具体逻辑可以自己定义

?

?

实际应用代码

?

 1 //查询所有老师负责的班级(一个老师对应一个班级)
 2         List<TeacherClass> list = new ArrayList<>(20);
 3         int count = 10;
 4         for (int i = 0; i < count; i++) {
 5             list.add(new TeacherClass(i,200 + i));
 6         }
 7 
 8         //程序出了一个bug,TeacherClass::getClassId
13,aLong2) -> aLong2 >= aLong ? aLong2 : aLong));
14         System.out.println("老师负责的班级ID:" + collect);

?

?

?

至此问题就解决了

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读