Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设计适合自定义排序的数据结构?_Java_Database - Fatal编程技术网

Java 如何设计适合自定义排序的数据结构?

Java 如何设计适合自定义排序的数据结构?,java,database,Java,Database,表中有一些项目,我希望用户可以自己定义这些项目的种类。 所以我在表中添加了一个字段sortValue(Int),表可能 name sortValue Jack 3 Paul 1 April 30 Alic 25 我使用下面的代码来显示按使用定义排序的项目 Select name, sortValue from myTable order by sortValue 结果将是 name sortValue Paul 1 Jack

表中有一些项目,我希望用户可以自己定义这些项目的种类。 所以我在表中添加了一个字段
sortValue(Int)
,表可能

name   sortValue
Jack       3
Paul       1
April      30
Alic       25
我使用下面的代码来显示按使用定义排序的项目

Select name, sortValue from myTable order by sortValue
结果将是

name   sortValue
Paul       1
Jack       3
Alic       25
April      30
我发现很难通过数据结构改变这些项的顺序

例如:

我希望记录
(name=Alic,sortValue=25)
位于第二位。我必须将记录更新为
(name=Alic,sortValue=2)

结果将是

name   sortValue
Paul       1
Alic       2
Jack       3
April      30

如果我需要记录
(name=April,sortValue=30)
下次在第二个位置,我发现我没有该记录的sortValue

您可以对
sortValue
列使用浮点类型,因此您将始终有一个空间在其他两个列之间插入一个新值

# if record is between others 
sortValue = (prevSortValue + nextSortValue)/2

# if record is last
sortValue = prevSortValue + 1
从理论上讲,当浮点精度用完时,可能会遇到与整数相同的问题。但实际上,这在很大程度上取决于您在其他人之间插入记录的频率。尤其是在同一条记录附近有很多插入项时


仅仅为了将新记录放在正确的位置而更新现有记录似乎效率很低,因为
update
的操作比
insert
要昂贵得多,并且需要锁定记录,您不需要修改这些记录。

您可以对
sortValue
列使用浮点类型,因此,您将始终有一个空间在其他两个值之间插入新值

# if record is between others 
sortValue = (prevSortValue + nextSortValue)/2

# if record is last
sortValue = prevSortValue + 1
从理论上讲,当浮点精度用完时,可能会遇到与整数相同的问题。但实际上,这在很大程度上取决于您在其他人之间插入记录的频率。尤其是在同一条记录附近有很多插入项时


仅仅为了将新记录放在正确的位置而更新现有记录似乎效率很低,因为
update
操作比
insert
要昂贵得多,并且需要锁定记录,您不需要修改。

您不能每次只交换两个值而不是创建一个新值吗?您不能每次只交换两个值而不是创建一个新值吗?这可以正常工作,但如果您想将某人的顺序更改为3,您现在必须找到现有的第二个和第三个条目,然后在(第2+3)/2.可以正常工作,前提是您可以轻松找到第2行和第3行(当然,您可以使用row_number()作为示例)。谢谢!还有更好的方法吗?相关的问题是如何为每个记录生成
sortValue
的值。使用随机函数填充?或使用prevSortValue+10000.00填充新记录?这可以正常工作,但如果要将某人的顺序更改为3,则必须找到现有的第二个和第三个条目,然后在(第2+3)/2处插入这一行。如果您可以轻松找到第2行和第3行(当然,您可以使用row_number()作为示例),则工作正常。谢谢!还有更好的方法吗?相关的问题是如何为每个记录生成
sortValue
的值。使用随机函数填写?或为新记录生成prevSortValue+10000.00?