我正在编写一个algorythm,它将从数据库接收行,这些行将在具有标识它们的属性和“ranking”属性的对象中定义。我必须使用一个集合(或找到一种方法)来保持所有这些对象按排名值排序,但是如果我收到另一个对象已经在集合中已经存在(排名除外),我需要更新排名值(将两个对象的排名相加)并保持集合的排序。
我正在考虑一个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')
提前多多感谢。
答案 0 :(得分:1)
我已经对TreeSet
和TreeMap
进行了一些实验,但无法为您的情况找到任何有趣的内容。根据您向集合中添加元素的频率,最好只使用HashMap
并在必要时对其进行排序。
为了提高效率,你甚至可以跟踪一些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
字段定义了一个类id
,并在覆盖Object#equals
和{{1时使用这些字段}}
答案 1 :(得分:0)
你在评论中说你的老师推荐了树木,但我不知道如何使用TreeSet或TreeMap类(至少就是这样)。
我认为最简单的方法是将条目存储在HashMap中。然后,当您需要排序列表时,可以在hashmap上调用values()
,对它们进行排序然后显示。你还提到条目数量不会超过300,所以无论如何排序都应该非常快。
答案 2 :(得分:0)
您可以按ID保留排名的实时地图,并将其用作优先级队列的基础,以保持项目的排序:
->src
----->main
---------->java
|-------->com.example.spring
|-------->com.example.spring.entities
|------>Employee.java
|-------->com.example.spring.repositories
|------>EmployeeRepo.java
|--------->DemoApplication.java
在更新排名之前必须删除该项目,以便可以将其重新插入正确的位置。另见:Updating Java PriorityQueue when its elements change priority