首先,这听起来像是家庭作业,但事实并非如此。这只是我在工作中试图解决的一个问题。
我有一个对象列表,这些对象有一个序列号,表示它们在 UI 列表中的顺序。示例:
public class Task {
Long id;
String name;
Long seq;
}
我的 UI 中的表格在表格的每一行都有“向上”和“向下”链接,用于在列表中上下移动任务。
我正在实现两种方法来处理重新排序。这些方法由 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 中,然后按序列号对映射进行排序。然后定位到map中的taskToMove,改变sequence number,然后改变所有受影响的tasks sequences。
但这种方法似乎不够优雅。有没有人知道我应该怎么做?
谢谢罗布
最佳答案
使用 Comparator
,这是用于非自然排序的 Java 接口(interface)。
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
类来实现每种支持的排序。然后,当您需要以特定方式对列表进行排序时,您可以从中进行选择。
关于java - 如何重新排序对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11086913/