1

首先,这听起来像是家庭作业,但事实并非如此。只是我在工作中试图解决的一个问题。

我有一个对象列表,这些对象有一个序列号,表示它们在 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,更改序列号,然后更改所有受影响的任务序列。

但这种方法似乎不优雅。有谁知道我应该怎么做?

谢谢,罗伯

4

4 回答 4

1

只是让列表保持排序。(除非您总是需要更新序列号)。

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);
}

对不起错别字

于 2012-06-18T16:34:26.677 回答
1

使用 a 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类来实现每种支持的排序。然后,当您需要以特定方式对列表进行排序时,您可以从中进行选择。

于 2012-06-18T16:21:30.707 回答
1

Comparator为您要排序的每个标准实施一个。

创建一个新的有序Collection对象(可能是 TreeSet),将其传递给所需的 Comparator。做 .addAll 的对象。

于 2012-06-18T16:21:56.917 回答
0

移动项目时使用双向链表并交换序列号。

于 2012-06-18T16:31:05.697 回答