java - 即使我得到更多已经在集合中的对象,我也需要保留按“排名”属性排序的对象集合
问题描述
我正在编写一个从数据库接收行的算法,这些行将在一个对象中定义,该对象具有识别它们的属性和“排名”属性。我必须使用一个集合(或找到一种方法)来保持所有这些对象按排名值排序,但是如果我收到另一个与集合中已经存在的对象相等的对象(排名除外),我需要更新排名值(将两个对象的排名相加)并保持集合排序。
我在考虑 TreeSet,但我无法更新不在根目录上的值......
好吧,假设我的收藏是这样的:
(name='Federer', id='131', ranking='3000')
(name='Nadal', id='234', ranking='2500')
(name='Del Potro', id='180', ranking='1800')
如果我收到这个:
(name='Nadal', id='234', ranking='1000')
集合最终应该是这样的:
(name='Nadal', id='234', ranking='3500')
(name='Federer', id='131', ranking='3000')
(name='Del Potro', id='180', ranking='1800')
提前非常感谢。
解决方案
我已经对 and 进行了一些实验TreeSet
,TreeMap
但找不到适合您情况的任何有趣的东西。根据您向集合中添加元素的频率,最好只使用 aHashMap
并在必要时对其进行排序。
为了更有效,您甚至可以跟踪一些boolean
表示HashMap
处于排序状态的标志(如果Map
已经排序,则如果没有任何变化,则无需再次排序!)。
var map = new HashMap<Element, Integer>();
map.put(new Element("Federer", 131), 3000);
map.put(new Element("Nadal", 234), 2500);
map.put(new Element("Del Potro", 180), 1800);
map.forEach((k, v) -> System.out.println(k + "=" + v));
System.out.println();
map.merge(new Element("Nadal", 234), 1000, Math::addExact);
map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEach(System.out::println);
输出:
[Federer, 131]=3000
[Nadal, 234]=2500
[Del Potro, 180]=1800
[Nadal, 234]=3500
[Federer, 131]=3000
[Del Potro, 180]=1800
注意:我Element
用name
and字段定义了一个类,并在覆盖andid
时使用这些字段。Object#equals
Object#hashCode
推荐阅读
- vue.js - 如何将任务添加到我的 Vue 2 待办事项应用程序的列表中?
- python - 来自文本文件的 Python 总和对
- python-3.x - 动态查找和“替换”方法时发生冲突
- javascript - ngx-extended-pdf-viewer 中的默认水平滚动不工作
- python - LSTM 时间序列输出与实际数据不匹配
- sql - TimescaleDB - 如何获得行之间的时间戳差异?
- python - django for loop on html 无法检索其 object_lists 的每个数据字段
- python - 如何在 conv2d (PyTorch) 中动态更改内核的大小?
- typescript - 打字稿:对象初始化时动态计算的字段
- ruby - On Array of Hashes 需要在 ruby 中同时创建其他密钥对时计算值