Ordering은 Guava 클래스 라이브러리에서 제공하는 선명하고 강력한 비교 도구입니다. Guava의 Ordering은 JDK Comparator보다 강력합니다. 확장이 매우 쉽고 복잡한 비교기를 쉽게 구성한 다음 컨테이너 비교, 정렬 및 기타 작업에 사용할 수 있습니다.
기본적으로 Ordering 인스턴스는 특별한 Comparator 인스턴스에 지나지 않습니다. Ordering은 단순히 비교기(예: Collections.max)에 의존하는 메서드를 취하여 인스턴스 메서드로 사용할 수 있도록 합니다. 또한 Ordering은 메서드 호출 연결 및 기존 비교기 기능 향상을 제공합니다.
Ordering의 구체적인 방법과 간단한 사용법을 살펴보겠습니다.
일반적인 정적 메서드:
natural(): Comparable 유형의 자연 순서를 사용합니다. 예를 들어 정수는 작은 것부터 큰 것까지, 문자열은 사전 순서입니다. usingToString( ): toString()에서 반환된 문자열을 사용하여 사전 순서로 정렬합니다.
arbitrary(): 모든 개체의 임의 순서를 반환합니다. 즉, Compare(a, b) == 0입니다. a == b (동등성). 순서 자체는 의미가 없지만 VM 수명 동안 일정합니다.
[code]import java.util.List; import org.junit.Test; import com.google.common.collect.Lists; import com.google.common.collect.Ordering; public class OrderingTest { @Test public void testStaticOrdering(){ List<String> list = Lists.newArrayList(); list.add("peida"); list.add("jerry"); list.add("harry"); list.add("eva"); list.add("jhon"); list.add("neron"); System.out.println("list:"+ list); Ordering<String> naturalOrdering = Ordering.natural(); Ordering<Object> usingToStringOrdering = Ordering.usingToString(); Ordering<Object> arbitraryOrdering = Ordering.arbitrary(); System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list)); System.out.println("usingToStringOrdering:"+ usingToStringOrdering.sortedCopy(list)); System.out.println("arbitraryOrdering:"+ arbitraryOrdering.sortedCopy(list)); } }
[code]list:[peida, jerry, harry, eva, jhon, neron] naturalOrdering:[eva, harry, jerry, jhon, neron, peida] usingToStringOrdering:[eva, harry, jerry, jhon, neron, peida] arbitraryOrdering:[neron, harry, eva, jerry, peida, jhon]
NullsFirst(): null이 아닌 요소 앞에 null을 배치하는 Ordering을 반환합니다. 그렇지 않으면 원본과 동일합니다. Ordering ;
NullsLast(): null이 아닌 요소 뒤에 null을 배치하는 Ordering을 반환하고 나머지는 원래 Ordering과 동일합니다(Comparator): Ordering을 반환합니다. Comparator , Comparator 를 두 번째 정렬 요소로 사용합니다. 예를 들어, 먼저 버그 수준에 따라 정렬한 다음 우선순위에 따라
사전순(): 다음에 따라 반복되는 순서를 반환합니다.
onResultOf(Function): 각 요소에 함수를 적용한 후 원래 순서를 사용하여 정렬합니다.
maximumOf(Iterable iterable, int k): 지정된 k- 반복 가능한 요소를 가장 큰 것부터 가장 작은 것 순으로 정렬합니다. 불안정하다.
lessOf(Iterable iterable,int k): 지정된 k번째 iterable의 가장 작은 요소를 가장 작은 것부터 큰 것 순으로 반환합니다. 불안정하다.
isOrdered(Iterable): 순서 여부에 관계없이 Iterable은 2개 요소보다 작을 수 없습니다.
isStrictlyOrdered(Iterable): 엄격하게 주문되었는지 여부입니다. Iterable은 두 개 미만의 요소를 가질 수 없습니다.
sortedCopy(Iterable): 지정된 요소를 목록의 정렬된 복사본으로 반환합니다.
[code]import java.util.List; import org.junit.Test; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Ordering; public class OrderingTest { @Test public void testOrdering(){ List<String> list = Lists.newArrayList(); list.add("peida"); list.add("jerry"); list.add("harry"); list.add("eva"); list.add("jhon"); list.add("neron"); System.out.println("list:"+ list); Ordering<String> naturalOrdering = Ordering.natural(); System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list)); List<Integer> listReduce= Lists.newArrayList(); for(int i=9;i>0;i--){ listReduce.add(i); } List<Integer> listtest= Lists.newArrayList(); listtest.add(1); listtest.add(1); listtest.add(1); listtest.add(2); Ordering<Integer> naturalIntReduceOrdering = Ordering.natural(); System.out.println("listtest:"+ listtest); System.out.println(naturalIntReduceOrdering.isOrdered(listtest)); System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(listtest)); System.out.println("naturalIntReduceOrdering:"+ naturalIntReduceOrdering.sortedCopy(listReduce)); System.out.println("listReduce:"+ listReduce); System.out.println(naturalIntReduceOrdering.isOrdered(naturalIntReduceOrdering.sortedCopy(listReduce))); System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(naturalIntReduceOrdering.sortedCopy(listReduce))); Ordering<String> natural = Ordering.natural(); List<String> abc = ImmutableList.of("a", "b", "c"); System.out.println(natural.isOrdered(abc)); System.out.println(natural.isStrictlyOrdered(abc)); System.out.println("isOrdered reverse :"+ natural.reverse().isOrdered(abc)); List<String> cba = ImmutableList.of("c", "b", "a"); System.out.println(natural.isOrdered(cba)); System.out.println(natural.isStrictlyOrdered(cba)); System.out.println(cba = natural.sortedCopy(cba)); System.out.println("max:"+natural.max(cba)); System.out.println("min:"+natural.min(cba)); System.out.println("leastOf:"+natural.leastOf(cba, 2)); System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list)); System.out.println("leastOf list:"+naturalOrdering.leastOf(list, 3)); System.out.println("greatestOf:"+naturalOrdering.greatestOf(list, 3)); System.out.println("reverse list :"+ naturalOrdering.reverse().sortedCopy(list)); System.out.println("isOrdered list :"+ naturalOrdering.isOrdered(list)); System.out.println("isOrdered list :"+ naturalOrdering.reverse().isOrdered(list)); list.add(null); System.out.println(" add null list:"+list); System.out.println("nullsFirst list :"+ naturalOrdering.nullsFirst().sortedCopy(list)); System.out.println("nullsLast list :"+ naturalOrdering.nullsLast().sortedCopy(list)); } } //============输出============== list:[peida, jerry, harry, eva, jhon, neron] naturalOrdering:[eva, harry, jerry, jhon, neron, peida] listtest:[1, 1, 1, 2] true false naturalIntReduceOrdering:[1, 2, 3, 4, 5, 6, 7, 8, 9] listReduce:[9, 8, 7, 6, 5, 4, 3, 2, 1] true true true true isOrdered reverse :false false false [a, b, c] max:c min:a leastOf:[a, b] naturalOrdering:[eva, harry, jerry, jhon, neron, peida] leastOf list:[eva, harry, jerry] greatestOf:[peida, neron, jhon] reverse list :[peida, neron, jhon, jerry, harry, eva] isOrdered list :false isOrdered list :false add null list:[peida, jerry, harry, eva, jhon, neron, null] nullsFirst list :[null, eva, harry, jerry, jhon, neron, peida] nullsLast list :[eva, harry, jerry, jhon, neron, peida, null]