]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_8_1_1/main/classes/core/src/com/ibm/icu/impl/IterableComparator.java
Added flags.
[Dictionary.git] / jars / icu4j-4_8_1_1 / main / classes / core / src / com / ibm / icu / impl / IterableComparator.java
1 /*
2  ************************************************************************************
3  * Copyright (C) 2007-2010, Google Inc, International Business Machines Corporation *
4  * and others. All Rights Reserved.                                                 *
5  ************************************************************************************
6  */
7 package com.ibm.icu.impl;
8
9 import java.util.Comparator;
10 import java.util.Iterator;
11
12 public class IterableComparator<T> implements Comparator<Iterable<T>> {
13     private final Comparator<T> comparator;
14     private final int shorterFirst; // = 1 for shorter first, -1 otherwise
15
16     public IterableComparator() {
17         this(null, true);
18     }
19
20     public IterableComparator(Comparator<T> comparator) {
21         this(comparator, true);
22     }
23
24     public IterableComparator(Comparator<T> comparator, boolean shorterFirst) {
25         this.comparator = comparator;
26         this.shorterFirst = shorterFirst ? 1 : -1;
27     }
28
29     public int compare(Iterable<T> a, Iterable<T> b) {
30         if (a == null) {
31             return b == null ? 0 : -shorterFirst;
32         } else if (b == null) {
33             return shorterFirst;
34         }
35         Iterator<T> ai = a.iterator();
36         Iterator<T> bi = b.iterator();
37         while (true) {
38             if (!ai.hasNext()) {
39                 return bi.hasNext() ? -shorterFirst : 0;
40             }
41             if (!bi.hasNext()) {
42                 return shorterFirst;
43             }
44             T aItem = ai.next();
45             T bItem = bi.next();
46             @SuppressWarnings("unchecked")
47             int result = comparator != null ? comparator.compare(aItem, bItem) : ((Comparable<T>)aItem).compareTo(bItem);
48             if (result != 0) {
49                 return result;
50             }
51         }
52     }
53
54     @SuppressWarnings("unchecked")
55     public static <T> int compareIterables(Iterable<T> a, Iterable<T> b) {
56         return NOCOMPARATOR.compare(a, b);
57     }
58
59     @SuppressWarnings("rawtypes")
60     private static final IterableComparator NOCOMPARATOR = new IterableComparator();
61 }