如何重新排序对象列表?

时间:2012-06-18 16:18:09

标签: java

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

我有一个对象列表,这些对象有一个序列号,表示它们在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

4 个答案:

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

抱歉打字错误