2013-06-06 3 views
1

다음과 같은 메서드를 사용할 수 있으므로 모든 개체 목록을 전달할 수 있으며 원하는 순서로 정렬 된 목록을 반환합니다.개체 목록 정렬

공개 목록 정렬 (목록 listToBeSorted, 문자열 순서, 문자열 속성) { } 그래서 위의 방법과 같이 호출하면

class Person{ 
    private String name; 
    private Date dob; 
    private int age; 
} 

: 그것은을 정렬합니다

sort(myList, "ascending", "name"); 

person 객체의 "name"속성의 오름차순으로 나열하십시오.


다음과 같이 Comparator를 사용해 보았지만 실제로 원하는 곳에 가까이 갈 수 없었습니다.

List<Person> myList = new ArrayList<Person>(); 
Collections.sort(myList, PersonComparator.NAME_COMPARATOR); 

편집 :

내가 준 예는 잘 작동 다음과 같이

public class PersonComparator { 
    public static final Comparator<Person> NAME_COMPARATOR = new Comparator<Person>() { 
     @Override 
     public int compare(Person object1, Person object2) {    
      return object1.getName().compareToIgnoreCase(object2.getName()); 
     }  
    }; 
    public static final Comparator<Person> DOB_COMPARATOR = new Comparator<Person>() { 
     @Override 
     public int compare(Person object1, Person object2) { 
      return object1.getDob().compareTo(object2.getDob()); 
     }  
    }; 
    public static final Comparator<Person> AGE_COMPARATOR = new Comparator<Person>() { 
     @Override 
     public int compare(Person object1, Person object2) { 
      return object1.getAge().compareTo(object2.getAge()); 
     }  
    }; 
} 

그리고는 비교기를 사용했다. 하지만 Person 클래스에서만 작동합니다. 어떤 개체 목록에 대해서도 사용할 수있는 메서드가 필요했고 개체의 속성뿐만 아니라 원하는 순서를 지정할 수있었습니다.

+1

'Comparator' 구현에 잘못된 것이 있어야합니다. 'Comparator' 구현 안에서 좀 더 복잡한 규칙을 수행 할 수 있습니다. –

+0

그 결과는 무엇입니까? – arynaq

+0

음, 작동해야합니다 ... 예제 데이터를 제공 할 수 있습니까? – fge

답변

2

오름차순 및 내림차순의 경우 reverseOrder을 사용하여 다른 Comparator을 얻을 수 있습니다. 이것은 Java에 의해 직접 지원되며, 순서를 뒤집는 효과를 얻기위한 다소 표준적인 방법입니다.

매개 변수에서 다른 필드 기반을 사용하려면 반성이 필요할 수 있습니다. 필드를 비교하기 전에 필드가 isAssaignableFromComparable인지 확인하기를 원할 수 있습니다. 그렇지 않으면 IllegalArgumentException 또는 그와 비슷한 것을 던지도록 선택할 수 있습니다.

3

Bean Comparator을 확인하십시오.

사람 개체의 "이름"속성의 오름차순으로 목록을 정렬합니다.

정렬 순서를 제어 할 수 있지만 속성 자체가 아닌 속성에 액세스하는 방법을 지정합니다.

+0

"org.apache.commons.beanutils.BeanComparator"의 BeanComparator를 사용해 보았습니다. 하지만 BeanComparator에는 블로그에서 제안하는 생성자가 없으며 매개 변수로 클래스와 문자열을 사용합니다. – Susie

+0

@Susie, org.apache ... – camickr

1

당신은 다음과 같이 구현할 수 있습니다 ...

class MyCompartor<E>{ 
    public Comparator<E> getCompartor(final String order,final String propertyName){ 

     return new Comparator<E>() { 

       @Override 
       public int compare(E o1, E o2) { 
         Class noparams[]={}; 
         try { 
          char temp[] = propertyName.toCharArray(); 
          temp[0] = Character.toUpperCase(temp[0]); 
          String tempName=new String(temp); 
          Method method = o1.getClass().getDeclaredMethod("get"+tempName, noparams); 
          Object val1 = method.invoke(o1, null); 
          Object val2 = method.invoke(o2, null); 
          if(order.equalsIgnoreCase("ascending")) 
          { 
           return ((Comparable)val1).compareTo(val2); 
          }else{ 
           return ((Comparable)val2).compareTo(val1); 
          } 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        return 0; 
       } 
      }; 
    } 
} 

이 도움이

Collections.sort(list,new MyCompartor<Person>().getCompartor("ascending", "name")); 

희망 같은 종류의 호출? 하지만 속성이 java.lang.Comparable 인 객체를 반환해야합니다.

+0

과 같은 클래스가 아니며 getters를 구현해야합니다. P – DarthCoder