java – Random ArrayIndexOutOfBoundsException,使用stream按值对Map元素进行排序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Random ArrayIndexOutOfBoundsException,使用stream按值对Map元素进行排序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2051字,纯文字阅读大概需要3分钟。
内容图文
![java – Random ArrayIndexOutOfBoundsException,使用stream按值对Map元素进行排序](/upload/InfoBanner/zyjiaocheng/819/6c13ba262ccb40448ea31d558ee9ea94.jpg)
在最后几天,我开始“玩”一些Java 8功能,比如流(我研究了一些文档和几个例子).
在我的应用程序中,我有一个Map,我需要获得具有最高值的三个元素(float部分).
我尝试对我的代码进行不同的修改(其中一些解决方案也是:Sort a Map
Map<Long, Float> great = createMapWith20Elements();
Map<Long, Float> small = great.entrySet().stream()
.sorted(Map.Entry.<Long, Float>comparingByValue().reversed())
.limit(3)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
但是reslt总是一样的:有时代码工作正常,其他它给了我一个
java.lang.ArrayIndexOutOfBoundsException: 19
在极少数情况下,超出界限的指数为18.
这种“随机”行为(18,19或正确的阐述)让我想到了一个“平行线程”问题.
我确信伟大的地图总是有20个元素…如果我打印它们我收到:
2,-0.5
3,0.0
4,0.0
5,0.0
6,0.0
7,-0.33333334
8,0.0
9,0.0
10,0.0
11,0.0
12,0.5
13,0.0
14,0.0
15,-0.5
18,0.0
19,0.0
21,0.0
22,0.0
23,0.0
24,0.0
我意识到有17个对象可以成为前3个……但对我的算法来说这不是问题.
你能以某种方式帮助我吗?
谢谢
编辑:
方法createMapWith20Elements()有一个虚拟名称,可以更好地解释我的情况:我确定它返回20个元素,因为它使数据库读取…但它应该返回任何匹配的记录.
顺便说一下它结束了
// myIds is an ArrayList<Long>
myIds.parallelStream().forEach(e -> trust.put(e, 0f));
return trust;
用myIds.stream()替换它似乎工作得很好……我无法弄清楚如何使用parallelStream写入一个对象(Collection而不是Stream),并在调用函数中返回对象本身(Collection)会导致这种问题.
解决方法:
我认为问题是方法createMapWith20Elements().
您正在同时在地图中插入元素(可能是HashMap或TreeMap),并且HashMap和TreeMap都不会同步.因此并发插入(put方法调用)会破坏地图结构(导致地图损坏).
如你所说:
// myIds is an ArrayList<Long>
myIds.parallelStream().forEach(e -> trust.put(e, 0f));
return trust;
有时会产生错误.但
// myIds is an ArrayList<Long>
myIds.stream().forEach(e -> trust.put(e, 0f));
return trust;
不会产生错误.
如果要同时插入,则必须使用同步包装器.所以你的代码应该是:
// myIds is an ArrayList<Long>
Map<Long, Float> syncTrust = Collections.synchronizedSortedMap(trust);
myIds.parallelStream().forEach(e -> syncTrust.put(e, 0f));
return trust;
内容总结
以上是互联网集市为您收集整理的java – Random ArrayIndexOutOfBoundsException,使用stream按值对Map元素进行排序全部内容,希望文章能够帮你解决java – Random ArrayIndexOutOfBoundsException,使用stream按值对Map元素进行排序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。