在不改变所有项目等级的情况下重新设置项目

时间:2017-07-21 22:13:33

标签: java algorithm sorting ranking rank

我有一个项目列表,每个项目都有一个与之关联的排名。

Item 1, Rank=1
Item 2, Rank=2
Item 3, Rank=3
Item 4, Rank=4
Item 5, Rank=5

我想设计一种方法来处理项目的重新排名,其他项目的排名变化很小或没有变化。

我想到的一个解决方案是利用小数并使用Java的双变量类型。因此,例如,如果我在item2和item3之间移动item5,那么这将是输出 -

Item 1, Rank=1
Item 2, Rank=2
Item 5, Rank=2.5
Item 3, Rank=3
Item 4, Rank=4

等等,

Item 1, Rank=1
Item 2, Rank=2
Item 4, Rank=2.25
Item 5, Rank=2.5
Item 3, Rank=3

这个解决方案有效,但是在某个点之后(在同一个位置移动~55次,我达到了双变量限制,我可能不得不重置所有等级)

我只是想知道是否有更好的方法来解决这个问题?

要记住一些事项。

  • 我需要将这个数据结构存储在一个数据库(Item,Rank)中,我将构建一个Web服务,它根据排名获得排序顺序的所有项目,所以我将进行数据库调用以获取所有项目的排序按等级字段。
  • 我将使用Java,因此我只能处理Java变量。

2 个答案:

答案 0 :(得分:2)

可能有多种解决方案,这是我更喜欢的解决方案

我将这个问题分成多个孤立的问题:

  1. 在您的java后端中,您希望拥有以某种方式排序的项目列表,并且可以按顺序快速进行O(1)更改。
  2. 最佳结构 - 双链表。您需要使用hashmap在此列表中快速按项目名称/ ID查找对象。

    您可以轻松地将此类结构存储到数据库中,只需在项目表中添加两个外键即可。在存储期间,您只需更新受影响的行(请记住,当您移动项目时,上一个/下一个项目也会受到影响)。它看起来像多个project-bravo

    1. 在您的java服务中,您希望尽快显示已排序的项目列表,可能是分页。
    2. 最佳结构 - 预先排序的数组。

      要在数据库中存储此类结构,您需要存储位置的列(排名)。当然,您需要在此列上建立索引。

      要检索此类结构,您将使用非常简单,快速和有效的查询,例如update table set prev=?, next=? where id=?

      现在你有矛盾,你的编辑数据结构与你的数据结构不匹配,任何尝试使用单一数据结构来解决这两个问题都会导致性能下降,让我们独立解决这个问题:

      1. 您将创建单独的异步服务(cron作业),它将从一个表中读取数据,转换(重新计算所有项目的排名)并存储在另一个表中。
      2. 在这里,您将有两个选项:在计算后完全替换第二个表中的数据或查找差异并仅更新已更改的行。我相信完全替换更容易实现,实际上它可以更快。

        因此,通过这种方法,客户可见的系统部分表现出色(数据管理部分和数据显示部分尽可能快地工作)。

        唯一的问题是变更传播,这通常很好,大多数用户会接受它作为合理的权衡。

答案 1 :(得分:2)

如何编写一个小程序,均匀地分配数组(或列表或其他)中一系列元素的等级值?

如果在位置x处插入新元素,则将范围x-1 .. x+1的元素传递到子例程中。开始和结束位置的等级值保持不变,其他等级用偶数距离计算。如果成功,返回true。现在,如果距离变得太小而返回false,则调用者将范围扩展到x-2 .. x+2并再次进入子例程。

你必须小心打击阵列边界,甚至完全耗尽价值空间。