Java에서 Object의 comparator를 여러 번을 사용하여 Object를 소팅하기 위해서는

Guava의 Ordering 클래스의 from()와 compound() 메소드를 이용해서 쉽고 간결하게 소팅을 할 수 있다. 



Ordering<Member> ordering = Ordering.from(new MemberById()).compound(new MemberBySubId());

Collections.sort(members, ordering);



예제) 



import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.junit.Test;

import com.google.common.collect.Lists;

import com.google.common.collect.Ordering;

import com.google.common.primitives.Ints;


public class OrderingTest {
@Test
public void test() {

Member
member1 = new Member();
member1.id = 100;
member1.subId = 3;

Member
member2 = new Member();
member2.id = 50;
member2.subId = 20;

Member
member3 = new Member();
member3.id = 100;
member3.subId = 1;

Member
member4 = new Member();
member4.id = 1;
member4.subId = 1;

Member
member5 = new Member();
member4.id = 100;
member4.subId = 2;

List<Member>
members = Lists.newArrayList(member1, member2, member3, member4, member5);

Ordering<Member>
ordering = Ordering.from(new MemberById()).compound(new MemberBySubId());
Collections.sort(
members, ordering);
System.
out.println(members);

}
}


class MemberBySubId implements Comparator<Member> {
@Override
public int compare(Member member1, Member member2) {
return Ints.compare(member1.subId, member2.subId);
}
}


class MemberById implements Comparator<Member> {

@Override
public int compare(Member member1, Member member2) {
return Ints.compare(member1.id, member2.id);
}

}


class Member {
int id;
int subId;

@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}




결과

[id=0,subId=0], [id=50,subId=20], [id=100,subId=1], [id=100,subId=2],[id=100,subId=3]]


Posted by '김용환'
,