首先,这听起来像是家庭作业,但事实并非如此。我正试图在工作中解决这个问题。
我有一个对象列表,这些对象有一个序列号,表示它们在UI列表中的顺序。例如:
public class Task {
Long id;
String name;
Long seq;
}
我的用户界面中的表格在表格的每一行都有“向上”和“向下”链接,用于在列表中上下移动任务。
我正在实现两种方法来处理重新排序。这些方法由web UI中的ajax调用。
public void incTaskSeq(List<Task> allTasks, Task taskToMove)
例如;如果我有t1.seq = 1,t2.seq = 2,t3.seq = 3,t4.seq = 4,t5.seq = 5,我想增加t3的位置,然后t3.seq变为4, t4.seq必须变为3。
public void decTaskSeq(List<Task> allTasks, Task taskToMove)
类似地;如果我有t1.seq = 1,t2.seq = 2,t4.seq = 3,t3.seq = 4,t5.seq = 5,我想减去t4的位置,然后t4.seq变为2, t2.seq必须变为3.结果:
t1.seq = 1,t4.seq = 2,t2.seq = 3,t3.seq = 4,t5.seq = 5
我有点坚持最好的方法。
我在考虑将所有任务放在HashMap中,然后按序列号对地图进行排序。然后在地图中找到taskToMove,更改序列号,然后更改所有受影响的任务序列。
但这种做法似乎不够优雅。有没有人有任何想法我应该怎么做?
谢谢,Rob
答案 0 :(得分:1)
使用Comparator
,这是非自然排序的Java接口。
public TaskSequenceComparator implements Comparator<Task> {
public int compare(Task one, Task two) {
return one.getSequence() - two.getSequence();
}
}
...
List<Task> tasks = ...;
Collections.sort(tasks, new TaskSquenceComaprator());
// tasks is now sorted by sequence.
您可以创建多个Comparator
类来实现各种支持的排序。然后,当您需要以特定方式排序的列表时,您可以从中进行选择。
答案 1 :(得分:1)
为您要排序的每个条件实施Comparator
。
创建一个新的有序Collection
对象(可能是TreeSet),将Comparator传递给它。做.add所有对象。
答案 2 :(得分:1)
使用双向链接列表并在移动项目时交换序列号。
答案 3 :(得分:1)
让List跟踪订购。 (除非您总是需要更新序列号。)
public void incTaskSeq(List<Task> allTasks, Task taskToMove){
int movTaskNum = 0;
for(int i=0;i<allTasks.size();i++){
if(allTasks.get(i).equals(taskToMove))
movTaskNum = i;
}
allTasks.remove(taskToMove);
allTasks.add(i-1, taskToMove);
}
抱歉打字错误