2012-01-30 4 views
1

정렬 두 방법을 I는 다음과 같습니다 간단한 자바 POJO있어 : 제가하고 싶은 것은 지금적절한 방법

class MyClass 
{ 
    public String getGroup(); 
    public String getTitle(); 
} 

을에 의해 반환 된 값을 기준으로 MyClass에의 POJO의 주로 종류의 목록에 getTitle() 메소드. 내 자신의 비교기를 사용하여 쉽게 갈 수 있습니다. 그러나, 내가 원하는 것은 getGroup()에 의해 리턴 된 동일한 값을 가진 인스턴스들이 서로 이어지는 것이다. 이제 내가 한 일은

.. compare(MyClass c1, MyClass c2) 
{ 
    if (c1.getGroup().compareTo(c2.getGroup()) == 0) 
    { 
    return c1.getTitle().compareTo(c2.getTitle()); 
    } 
    return c1.getGroup().compareTo(c2.getGroup()); 
} 

같은 그러나,이 코드의 문제는 내가 처음 그룹이 아닌 제목의 내용을 비교합니까 때문에 더 이상 주로 제목에 의해 이렇게 그룹을 분류되지 않는 것입니다이었다 "B"로 시작하는 그룹은 "C"로 시작하는 그룹보다 우선적으로 제목이 올 수 있습니다. 우선 제목별로 정렬하는 적절한 방법은 무엇입니까? 그룹도 함께 "그루핑"되어 있는지 확인하십시오.

샘플 데이터 :

MyClass 1 (group = "A", title="5") 
MyClass 2 (group = "B", title="9") 
MyClass 3 (group = "B", title="1") 

MyClass 1 (group = "A", title="5") 
MyClass 3 (group = "B", title="1") 
MyClass 2 (group = "B", title="9") 

에 끝날 것입니다 내 이전 코드를 사용 - 그룹 별> 정렬 한 후 정렬 제목별로

는하지만 내가 원하는

MyClass 3 (group = "B", title="1") 
MyClass 2 (group = "B", title="9") 
MyClass 1 (group = "A", title="5") 

-> sor 제목별로 t하지만 확인은 반드시 각각의 동일한 그룹이 ... 제목이 왜 아직도 MyClass에 1 "5"제목 "9"와 MyClass에이 다음에 오는의 각 다른 다음과

적절한 방법 무엇
+1

당신이 원하는 것을 분명하지 않다. 주로 * 제목으로 정렬되거나 * 그룹별로 정렬되어야합니다. 몇 가지 샘플 데이터와 출력을 원하는대로 제공하십시오. –

+0

'group'과'title' 사이에는 어떤 논리적 관계가 있습니까? – UmNyobe

+0

아니, 아니야. 제목은 정렬을위한 것이며, 그룹은 순서대로 물건을 보관하는 것입니다 (제목 뒤에). – anderswelt

답변

0

비교기로 수행 할 수 없습니다. 정렬 된 제목을 실행해야하며, 각각의 제목에 대해 해당 그룹을 정렬하십시오. 다음은 원하는 방식으로 정렬 된 샘플 코드입니다.

public class MyClass { 
    private String group; 
    private String title; 

    public MyClass(String g, String t) { 
     group=g; 
     title=t; 
    } 

    static Comparator<MyClass> TITLE_COMPARATOR = 
      new Comparator<MyClass>() { 
        @Override 
        public int compare(MyClass c1, MyClass c2) { 
          return c1.title.compareTo(c2.title); 
        } 
      }; 
    static Comparator<MyClass> GROUP_COMPARATOR = new Comparator<MyClass>() { 
        @Override 
        public int compare(MyClass c1, MyClass c2) { 
          return c1.group.compareTo(c2.group); 
        } 
      }; 

    public static List<MyClass> sublist(List<MyClass> list, String group) { 
      ArrayList<MyClass> ret = new ArrayList<MyClass>(); 
      for (MyClass mc : list) 
       if (mc.group.equals(group)) 
        ret.add(mc); 
      return ret; 
     } 

public static void main(String[] argv) { 
    ArrayList<MyClass> sorted = new ArrayList<MyClass>(); 

    ArrayList<MyClass> list = new ArrayList<MyClass>(); 
    list.add(new MyClass("A", "5")); 
    list.add(new MyClass("B", "9")); 
    list.add(new MyClass("B", "1")); 
    Collections.sort(list, TITLE_COMPARATOR); 
    Hashtable<String, Boolean> visited = new Hashtable<String, Boolean>(); 
    for (MyClass mc : list) { 
     if (visited.get(mc.group) == null) { 
      List<MyClass> sublist = sublist(list, mc.group); 
      Collections.sort(sublist, GROUP_COMPARATOR); 
      sorted.addAll(sublist); 
      visited.put(mc.group, Boolean.TRUE); 
     } 
    } 

    for (MyClass mc : sorted) 
     System.out.println(mc.group + " " + mc.title); 
} 

}

1

에 주로 종류의 제목이 아니라 그룹이 함께 "그루 핑"되는지 확인하십시오.

은 당신의 비교기 어디에서나 getGroup()getTitle() 전환, 그룹 제목 다음 으로 정렬합니다. 즉 당신이 당신의 요구 사항을 명확히하십시오 달성하려고하는 게 아니에요 경우

int compare(MyClass c1, MyClass c2) 
{ 
    int cmp = c1.getTitle().compareTo(c2.getTitle()); 
    if (cmp == 0) { 
    cmp = c1.getGroup().compareTo(c2.getGroup()); 
    } 
    return cmp; 
} 

: 여기

대안, 단순화 된 버전입니다.

+0

나는 그가 원하는 것 중 하나라고 생각하지 않습니다. – Bohemian

0

"그룹으로 묶어서"라는 말은 그룹 그룹을 먼저 정렬 한 다음 제목을으로 정렬하는 것을 의미합니다.

주변을 둘러 볼 필요가 없습니다.

나는 이미 코딩 한 것을 원한다고 생각합니다.

0

Comparator에서 .getTitle 대신 .getTitle (또는 그 반대)을 사용해보십시오. 나는 네가 네가 다른 방향으로하고있는 일을해야한다고 생각해.