티스토리 뷰


Collections.sort 에다가 comparator 로 대상 변수만 지정해주면
중복없이 쉽게 정렬이 가능하다. 코딩도 짧아지고 속도도 빨라진다.

downMyData : ArrayList<>형식의 데이터가 들어있다고 가정
myArrayData : sort 용 비어있는 ArrayList<>



//비어있는 sort용 ArrayList
  List myArrayData = new ArrayList();

 //일단 데이터를 sort용 ArrayList<>에 넣는다.
  for(int i = 0 ; i < downMyData.size(); i++) {
   myArrayData.add(downMyData.get(i));
  }//end for



//Comparator 를 만든다.
    private final static Comparator myComparator= new Comparator() {
        private final Collator   collator = Collator.getInstance();
  @Override
  public int compare(custom object1,custom object2) {
   return collator.compare(object1.getData(), object2.getData());
  }
 };


// Collections.sort 로 comparator 를 주어서 데이터를 정렬 시킨다.
Collections.sort(myArrayData ,myComparator);


//정렬된 ArrayList를 Adapter에 넣고 리스트뷰에 배치한다.
ListView MyListView = (ListView)findViewById(R.id.mylistview);
MyAdapter adapter = new MyAdapter (this,R.layout.my_item,myArrayData );
MyListView.setAdapter(adapter);




요러면 끝이다.  Comparator  는 compare에 ArrayList의 colum중 정렬시키고자 하는 데이터를 넣으면된다.
여기서 getData() 가 두개인 이유는 내부적으로 데이터를 하나하나 비교해 sort 시키기 때문이다.
sort메소드를 손수 만들어 사용해본 사람이라면 이해가 쉬울것이다.

데이터를 역순정렬하려면 밑에처럼 하면 한방에 해결된다.
Comparator comparator = Collections.reverseOrder();
Collections.sort(myArrayData ,comparator);

[▼추가]

하지만 위의 역순정렬은 추천하지 않는다. 별도의 comparator 가 필요할경우 역순정렬comparator와 중복해서 사용할 수 없기 때문이다.

그래서 밑에 방법을 추천한다.
일단 정순정렬을 실시한 후 뒤집는 방법이다.
    Collections.sort(myArrayData, myComparator);
    Collections.reverse(myArrayData);


위 처럼 하면 정상적으로 역순정렬이 가능하다.

[▼추가]

*string이 아닌 int 값을 campare 할 때
 Comparator는 String 이나 Class등은 받을 수 있지만 int값을 받지 못한다.
int를 string 으로 변환하여 compare 하면..  sort 하는 의미가 없어져 버린다.
1200 보다 130 이 더 높은값으로 인식 하기 때문이다.
이럴때는 int값을 string으로 바꾸어주고 자릿수를 고정으로 맞춰주면
정상적인 sort가 가능하다.

    private final static Comparator myComparator= new Comparator() {
        private final Collator   collator = Collator.getInstance();
  @Override
  public int compare(custom object1,custom object2) {
   
   //숫자는 문자열로 변환시 길이가 가변이라서 값에따른 sort가 비정상(1200보다 130이 높게 나옴) 
   //문자열의 길이를 맞추어 compare 를 만들면 정상적인 sort가 가능
   String price1 = getData1();
   String price2 = getData2();
   String tmp1 = "";
   String tmp2 = "";
   
   if(getData1() < 5){
    tmp1 = tmp1 + "0";
   }
   if(getData2() < 5){
    tmp2 = tmp2 + "0";
   }
   return collator.compare(tmp1+price1, tmp2+price2);
  }
 };



[출처,원본] http://devbible.tistory.com , http://devbible.tistory.com/13
[작성자] devbible.tistory.com

댓글
  • 프로필사진 TheBlackSnow 좋은 자료 감사합니다.
    리스트 정렬이 필요했었는데 덕분에 잘 풀 수 있겠네요. ^^
    2011.07.28 01:04
  • 프로필사진 Favicon of https://mydevromance.tistory.com BlogIcon 데브로망스 좋은 글 감사합니다! ^^ 2014.05.12 10:46 신고
  • 프로필사진 Favicon of https://2parkworld.tistory.com BlogIcon 2PARK 정말정말 감사합니다. 정말 제가 찾던 내용이 제대로 들어있네요.
    근데 책 쓰셔도 되겠어요.
    설명이 너무 좋았습니다. 진심으로요 ^^
    2015.07.18 22:47 신고
  • 프로필사진 Favicon of https://devbible.tistory.com BlogIcon devbible 개발하면서 직접 겪은걸 하나하나 정리한건데요. 부족한부분이 많이보이는데도 칭찬해주시니 너무 감사합니다. ^^ 2015.07.31 23:12 신고
  • 프로필사진 김병희 감사합니다.
    제가 찾던 바로 그 소스입니다.
    복잡한 소스는 싫어하는데 ...

    참고하여
    ListView 갱신 단방에 끝/[Android] http://blog.daum.net/andro_java/175
    ListView 정렬 단방에 끝/[Android] http://blog.daum.net/andro_java/176
    두 페이지를 만들고,
    둘째 페이지에는 님의 글을 베껴서 올렸습니다.

    건강하고 즐겁게 사시기 바랍니다.
    2016.05.14 19:09
  • 프로필사진 Favicon of https://devbible.tistory.com BlogIcon devbible 댓글 감사합니다. 제 블로그는 언제나 펌 환영입니다. 건강하세요~ 2016.05.14 19:13 신고
  • 프로필사진 김병희 님의 마지막 코드
    private final static Comparator myComparator= new Comparator() { ...
    베껴서 자보소스에 넣어 보았습니다.
    그랬더니
    첫줄 끝의 Comparator() 에 밑줄 생겼습니다.
    <알트+엔터> 임플리먼트 ... 선택하니
    private final Collator collator = Collator.getInstance();
    위에
    public int compare(Object lhs, Object rhs) {
    return 0;
    }
    삽입되더군요.
    또 빨강색 글씨로 변한 것이 custom, getData1, getData2 셋인데
    결정적으로 궁금한 것은,
    그 셋이 어디에서 오는 것인지 제가 알지 못하는 점입니다.
    -
    저는 순수한 수치를 비교하는 것이 아니라 수치 문자열과 수치 아닌 문자열이 공존하는 텍스트를 비교하려 합니다.
    제 수준에서 이해할 수 있는 도움을 주신다면 고맙겠습니다.
    2016.05.25 08:26
댓글쓰기 폼