我有这样的事情:
public class TestItem {
double priority;
String name;
String phoneNumber;
//getter setters
.
.
.
//action
public void moveOrder(TestItem before, TestItem after) {
}
}
我想通过在所需项目之间拖动列表来实现列表的重新排序。 假设这是我的清单。
TestItem 1 (priority = 1)
TestItem 2 (priority = 2)
TestItem 3 (priority = 3)
TestItem 4 (priority = 4)
TestItem 5 (priority = 5)
如果我想在1和2之间移动TestItem 4,它将变为如下:
TestItem 1 (priority = 1)
TestItem 4 (priority = 1.5)
TestItem 2 (priority = 2)
TestItem 3 (priority = 3)
TestItem 5 (priority = 5)
TestItem 4的顺序是1和2的平均值。 我的问题是当我继续重新排序时,订单的价值会变小。
我还没有任何关于如何在达到某个价值时进行纠正的想法。 也许我应该再次检索所有列表?是否有像这样实现的参考?
非常感谢任何建议或参考。
答案 0 :(得分:0)
如果您正在寻找一种方法来对数组进行排序选择排序是一个可行的简单解决方案。 https://en.wikipedia.org/wiki/Selection_sort
只需确保重新分配优先级,而不是索引
public void moveOrder(TestItem before, TestItem after) {
this.priority = (before.priority + after.priority) / 2.0;
}
希望这有帮助, 肖恩
答案 1 :(得分:0)
这取决于你想要实现的目标。
分裂和乘法一样糟糕,你会看到它可能更容易溢出......
TestItem 1 (priority = 1)
TestItem 2 (priority = 2)
TestItem 3 (priority = 3)
TestItem 4 (priority = 4) // move this between 1 and 2
TestItem 5 (priority = 5)
是和是奇数,乘以2,这将导致
TestItem 1 (priority = 2) // *2
-> TestItem 4 (priority = 3) // (2+4)/2
TestItem 2 (priority = 4) // *2
TestItem 3 (priority = 6) // *2
//TestItem 4 (priority = 4) original position
TestItem 5 (priority = 10) // *2
但你需要访问列表中的所有项目,如果你能做到这一点,只需增加新职位后的优先级
TestItem 1 (priority = 1)
-> TestItem 4 (priority = 2) // 1 + 1
TestItem 2 (priority = 3)
TestItem 3 (priority = 4)
//TestItem 4 (priority = 4) original position
TestItem 5 (priority = 5) // prev. priority + 1
答案 2 :(得分:-1)
我会使用Priority Queue及其remove和add方法。
修改强>
如果您需要在任何时间点保留对特定元素的引用,那么将Hashmap
的电话号码作为键,并将对应的优先级队列元素作为值引用魔法。当您需要重新排序时,从UI中选择3个元素(我猜),然后通过Hashmap
查找在O(1)中找到它们,最后,您拥有所需的所有优先级。您需要修改要移动的元素的优先级。您无需担心更新HashMap
中的引用 - 它将始终更新。
示例:列表= x,y,z 您需要在y和z之间移动x,因此列表看起来像y,x,z。 通过使用电话号码进行Hashmap查找,可以找到x,y和z。那么x的新优先级是:
p(x)= p(z)-p(y)/2.0
我认为所有优先事项都是正面doubles
。现在您的“列表”已重新排序。
祝你好运!