1

まず、これは宿題のように聞こえますが、そうではありません。私が仕事で解決しようとしている問題です。

オブジェクトのリストがあります。オブジェクトには、UIのリストでの順序を示すシーケンス番号があります。例:

public class Task {
  Long id;
  String name;
  Long seq;
}

私のUIのテーブルには、リスト内でタスクを上下に移動するための「上」リンクと「下」リンクがテーブルの各行にあります。

並べ替えを処理するために2つのメソッドを実装しています。これらのメソッドは、WebUIの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を見つけ、シーケンス番号を変更してから、影響を受けるすべてのタスクシーケンスを変更します。

しかし、このアプローチはエレガントではないようです。誰かが私がこれをどのように行うべきかについて何か考えを持っていますか?

ありがとう、ロブ

4

4 に答える 4

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クラスを作成して、サポートされているソートの種類ごとに実装できます。次に、特定の方法でリストを並べ替える必要がある場合に、それらから選択できます。

于 2012-06-18T16:21:30.707 に答える
1

Comparator並べ替える基準ごとにを実装します。

Collection必要なコンパレータを渡す新しい順序付きオブジェクト(おそらくTreeSet)を作成します。すべてのオブジェクトを.addAllします。

于 2012-06-18T16:21:56.917 に答える
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 に答える
0

二重にリンクされたリストを使用し、アイテムを移動するときにシーケンス番号を交換します。

于 2012-06-18T16:31:05.697 に答える