前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java.lang.IllegalStateException: Duplicate key 20

java.lang.IllegalStateException: Duplicate key 20

作者头像
用户1518699
发布2019-08-08 10:15:39
1.5K0
发布2019-08-08 10:15:39
举报
文章被收录于专栏:nice_每一天nice_每一天

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

正常案例

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

代码语言:javascript
复制
 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 }

老师与班级的关系

实际应用代码

代码语言:javascript
复制
 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, 导致有一个老师负责两个班级。那么再执行之前的代码会有什么问题呢?

代码语言:javascript
复制
 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         //程序出了一个bug,导致有一个老师负责两个班级
 9         list.add(new TeacherClass(50, 100, 300));
10 
11         //结果返回每个老师对应的班级ID
12         Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(TeacherClass::getTeachId, 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。具体逻辑可以自己定义

实际应用代码

代码语言:javascript
复制
 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         //程序出了一个bug,导致有一个老师负责两个班级
 9         list.add(new TeacherClass(50, 100, 300));
10 
11         //结果返回每个老师对应的班级ID
12         Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(TeacherClass::getTeachId, TeacherClass::getClassId
13                 , (aLong, aLong2) -> aLong2 >= aLong ? aLong2 : aLong));
14         System.out.println("老师负责的班级ID:" + collect);

至此问题就解决了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正常案例
  • 错误案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档