2012-06-18 5 views
0

첫째, 이것은 숙제처럼 들릴 것 같지만 그렇지 않습니다. 내가 직장에서 풀려고하는 문제.개체 목록을 재정렬하는 방법은 무엇입니까?

개체 목록이 있으며 개체의 순서는 UI의 목록에서 순서를 나타냅니다. 예 :

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

내 UI의 테이블에는 목록의 작업을 위아래로 이동하기위한 테이블의 각 행에 "위로"및 "아래로"링크가 있습니다.

재정렬을 처리하는 두 가지 방법을 구현 중입니다. 이 메소드는 웹 UI에서 아약스에 의해 호출됩니다.

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이되어야합니다.

마찬가지로; t1.seq = 1, t2.seq = 2, t4.seq = 3, t3.seq = 4, t5.seq = 5이면 t4의 자리를 감소시키고 t4.seq는 2가되고 난

t1.seq = 1, t4.seq = 2, t2.seq = 3, t3.seq = 4, t5.seq = 5

: t2.seq는 결과 3.이되어야한다 이것을하기위한 최선의 방법에 조금 붙어 있습니다.

나는 모든 작업을 HashMap에 넣은 다음 시퀀스 번호로 맵을 정렬하려고 생각했다. 그런 다음 맵에서 taskToMove를 찾고 시퀀스 번호를 변경 한 다음 영향을받은 모든 작업 시퀀스를 변경하십시오.

하지만이 방법은 멋지지 않을 것 같습니다. 아무도 내가 어떻게해야하는지에 대한 아이디어가 있습니까?

감사합니다, 비 자연적으로 정렬 자바 인터페이스 롭

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

. 그것은 사전을 만들고 "알파벳"이 단어 17이라고 말하는 것과 같습니다. 단어 자체에 의존하는 것이 아니라 그것이 속한 모음 (어떤 순서가 선택되었는지, 어떻게 단어가 이전인지)에 의존합니다. – SJuan76

답변

0

사용하십시오 Comparator.

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 클래스를 생성 할 수 있습니다. 그런 다음 특정 방식으로 정렬 된 목록이 필요할 때 선택할 수 있습니다.

+0

하지만 항목을 정렬 할 필요는 없으며 항목의 순서를 다시 매겨야합니다. 자세한 내용을 추가하겠습니다. –

+0

목록을 재정렬하는 것은 정렬하는 것입니다. 단순히 비표준 순서로 일부 항목을 꺼내는 것은 목록을 재정렬하는 것이 아닙니다. –

+0

@RobertHume'Seq' 필드가'Task'와 관련이 없지만 외부에 있다면 그것은 클래스에 있으면 안됩니다. – SJuan76

1

정렬 할 기준별로 Comparator을 구현하십시오.

새롭게 주문한 Collection 개체 (아마도 TreeSet)를 생성하여 필요한 Comparator를 전달합니다. .addAll 오브젝트를 수행하십시오.

+0

+1 사용자 정의 Comparator가있는 TreeMap 또는 TreeSet과 같은 자체 균형 조정 데이터 구조를 사용하는 것이 최선의 방법입니다. – sperumal

1

항목을 이동할 때 이중 연결 목록을 사용하고 순서 번호를 서로 바꿉니다.

+0

흥미 롭습니다. –

1

목록을 순서 만 고집하게하십시오. (당신은 항상 seqence 번호를 업데이트해야합니다.) 그것은, 당신이 정말로 용기의 따라 클래스 속성 (일련 번호) 내에서 우아 가하고있다 오타 물론

+0

도움을 주셔서 감사합니다. 비슷한 것으로 발견되었습니다 :'Collections.swap (arrayList, i, i-1);' –

관련 문제