핸드 비교기comparator

4628 단어 comparator
프로젝트에서 일부 데이터를 정렬해야 하기 때문에 비교적 강한 비교기에 적용했는데 괜찮은 것 같아서 코드를 붙인다.


public class XXXComparator<E> {
    private final Logger log = Logger.getLogger(XXXComparator.class);

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void sort(List<E> list, final String method, final String sortType) {
        // list     list     
       // method     get    
      // sortType  desc or asc

        Collections.sort(list, new Comparator() {

            public int compare(Object a, Object b) {
                int ret = 0;
                try {
                    Method m1 = ((E) a).getClass().getMethod(method, null);
                    Method m2 = ((E) b).getClass().getMethod(method, null);
                    if (sortType != null && "desc".equals(sortType)) {
                        ret = m2.invoke(((E) b), null).toString()
                                .compareTo(m1.invoke(((E) a), null).toString());
                    } else {
                        ret = m1.invoke(((E) a), null).toString()
                                .compareTo(m2.invoke(((E) b), null).toString());
                    }
                } catch (NoSuchMethodException e) {
                    log.error(e);
                } catch (InvocationTargetException e) {
                    log.error(e);
                } catch (IllegalAccessException e) {
                    log.error(e);
                }
                return ret;
            }
        });
    }

}


예를 들어 나는 People 대상이 하나 있는데 그 안에name,age 등의 속성이 있다.
현재 나는 People의list 목록을 가지고 있는데, 예를 들어name이나age로 정렬해야 한다
자, 이렇게 써도 돼요.

XXXComparator<People> sortList = new XXXComparator<People>();
String method = "getName"; //or  'getAge'
String orderByType = "desc";
sortList.sort(peopleList, method, orderByType);


이렇게 하면 속성별로 정렬할 수 있어요.
위의comparator에 최적화를 진행하였으며, int 형식의 데이터 응용 방법에 문제가 있을 수 있습니다


public class XXXComparator<E> {
    private final Logger log = Logger.getLogger(XXXComparator.class);

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void sort(List<E> list, final String methodName, final String sortType) {
        Collections.sort(list, new Comparator() {

            public int compare(Object a, Object b) {
                int ret = 0;
                try {

                    Method method = a.getClass().getMethod(methodName);

                    Object aResult = method.invoke(a);
                    Object bResult = method.invoke(b);

                    if (aResult == null) {
                        return -1;
                    }
                    if (bResult == null) {
                        return 1;
                    }
                    if (aResult instanceof String) {
                        String com1 = "desc".equals(sortType) ? (String) aResult : (String) bResult;
                        String com2 = "desc".equals(sortType) ? (String) bResult : (String) aResult;
                        log.info("aResult= " + aResult + "
bResult= " + bResult); return com1.toLowerCase().compareTo(com2.toLowerCase()); } if (aResult instanceof Comparable) { Comparable com1 = "desc".equals(sortType) ? (Comparable) aResult : (Comparable) bResult; Comparable com2 = "desc".equals(sortType) ? (Comparable) bResult : (Comparable) aResult; return com1.compareTo(com2); } } catch (NoSuchMethodException e) { log.error(e); } catch (InvocationTargetException e) { log.error(e); } catch (IllegalAccessException e) { log.error(e); } return ret; } }); } }

좋은 웹페이지 즐겨찾기