首页 > 解决方案 > 即使我得到更多已经在集合中的对象,我也需要保留按“排名”属性排序的对象集合

问题描述

我正在编写一个从数据库接收行的算法,这些行将在一个对象中定义,该对象具有识别它们的属性和“排名”属性。我必须使用一个集合(或找到一种方法)来保持所有这些对象按排名值排序,但是如果我收到另一个与集合中已经存在的对象相等的对象(排名除外),我需要更新排名值(将两个对象的排名相加)并保持集合排序。

我在考虑 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')

提前非常感谢。

标签: javacollectionstree

解决方案


我已经对 and 进行了一些实验TreeSetTreeMap但找不到适合您情况的任何有趣的东西。根据您向集合中添加元素的频率,最好只使用 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

注意:我Elementnameand字段定义了一个类,并在覆盖andid时使用这些字段。Object#equalsObject#hashCode


推荐阅读