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]]
'general java' 카테고리의 다른 글
[Guava] 자주 사용하는 Maps api (0) | 2015.04.09 |
---|---|
[Guava] 자주 사용하는 Sets api (0) | 2015.04.09 |
[eclipse] tab 또는 빈 공백 없애기 (0) | 2015.04.03 |
Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar (0) | 2015.03.26 |
[play1] python 2.4에서의 1.3.0 실행 (0) | 2015.03.26 |