我需要保留按“排名”属性排序的对象集合,即使我获得了集合中已有的更多对象

时间:2018-05-22 21:37:49

标签: java collections tree

我正在编写一个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')

提前多多感谢。

3 个答案:

答案 0 :(得分:1)

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

注意:我使用Elementname字段定义了一个类id,并在覆盖Object#equals和{{1时使用这些字段}}

答案 1 :(得分:0)

你在评论中说你的老师推荐了树木,但我不知道如何使用TreeSet或TreeMap类(至少就是这样)。

  • TreeMap按键排序(在你的情况下是id), 而你想根据他们的排名来订购这些参赛作品。
  • 另一方面,TreeSet需要一些可以帮助它的属性 将两个条目相互比较,只保留那些条目 是独一无二的(因为它是一套)。如果你想基于比较 排名,然后如果两个排名相等,树集会认为 两个条目是等价的(可能不是这样)。如果你比较 基于ids,然后它将根据ID而不是 排名。

我认为最简单的方法是将条目存储在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