Sorterpublic class Sorter extends Object This class defines a bunch of static methods for efficiently sorting
arrays of Strings or other objects. It also defines two interfaces that
provide two different ways of comparing objects to be sorted. |
Fields Summary |
---|
private static Comparer | ascii_comparerThis is an internal Comparer object (created with an anonymous class)
that compares two ASCII strings.
It is used in the sortAscii methods below. | private static Comparer | comparable_comparerThis is another internal Comparer object. It is used to compare two
Comparable objects. It is used by the sort() methods below that take
Comparable objects as arguments instead of arbitrary objects |
Methods Summary |
---|
public static void | sort(Sorter$Comparable[] a, java.lang.Object[] b, int from, int to, boolean up)Sort a portion of array a of Comparable objects. If up is true,
sort into ascending order, otherwise sort into descending order.
Re-arrange the array b in exactly the same way as a.
sort(a, b, from, to, up, comparable_comparer);
| public static void | sort(java.lang.Object[] a, Sorter$Comparer c)Sort an array of arbitrary objects into ascending order, using the
comparison defined by the Comparer object c
sort(a, null, 0, a.length-1, true, c);
| public static void | sort(java.lang.Object[] a, int from, int to, boolean up, Sorter$Comparer c)Sort a portion of an array of objects, using the comparison defined by
the Comparer object c. If up is true, sort into ascending order,
otherwise sort into descending order.
sort(a, null, from, to, up, c);
| public static void | sort(java.lang.Object[] a, java.lang.Object[] b, int from, int to, boolean up, Sorter$Comparer c)This is the main sort() routine. It performs a quicksort on the elements
of array a between the element from and the element to. The up argument
specifies whether the elements should be sorted into ascending (true) or
descending (false) order. The Comparer argument c is used to perform
comparisons between elements of the array. The elements of the array b
are reordered in exactly the same way as the elements of array a are.
// If there is nothing to sort, return
if ((a == null) || (a.length < 2)) return;
// This is the basic quicksort algorithm, stripped of frills that can make
// it faster but even more confusing than it already is. You should
// understand what the code does, but don't have to understand just
// why it is guaranteed to sort the array...
// Note the use of the compare() method of the Comparer object.
int i = from, j = to;
Object center = a[(from + to) / 2];
do {
if (up) { // an ascending sort
while((i < to) && (c.compare(center, a[i]) > 0)) i++;
while((j > from) && (c.compare(center, a[j]) < 0)) j--;
} else { // a descending sort
while((i < to) && (c.compare(center, a[i]) < 0)) i++;
while((j > from) && (c.compare(center, a[j]) > 0)) j--;
}
if (i < j) {
Object tmp = a[i]; a[i] = a[j]; a[j] = tmp; // swap elements
if (b != null) { tmp = b[i]; b[i] = b[j]; b[j] = tmp; }// swap b, too
}
if (i <= j) { i++; j--; }
} while(i <= j);
if (from < j) sort(a, b, from, j, up, c); // recursively sort the rest
if (i < to) sort(a, b, i, to, up, c);
| public static void | sort(java.lang.String[] a)Sort an array of strings into ascending order, using the correct
collation order for the default locale
sort(a, 0, a.length-1, true, false, null);
| public static void | sort(java.lang.String[] a, int from, int to, boolean up, boolean ignorecase)Sort a portion of an array of strings, using the collation order of
the default locale. If up is true, sort ascending, otherwise, sort
descending. If ignorecase is true, ignore the capitalization of letters
sort(a, from, to, up, ignorecase, null);
| public static void | sort(java.lang.String[] a, int from, int to, boolean up, boolean ignorecase, java.util.Locale locale)Sort a portion of an array of strings, using the collation order of
the specified locale. If up is true, sort ascending, otherwise, sort
descending. If ignorecase is true, ignore the capitalization of letters
// Don't sort if we don't have to
if ((a == null) || (a.length < 2)) return;
// The java.text.Collator object does internationalized string compares
// Create one for the specified, or the default locale.
Collator c;
if (locale == null) c = Collator.getInstance();
else c = Collator.getInstance(locale);
// Specify whether or not case should be taken into account in the sort.
// Note: this option does not seem to work correctly in JDK 1.1.1
// using the default American English locale.
if (ignorecase) c.setStrength(Collator.SECONDARY);
// Use the Collator object to create an array of CollationKey objects that
// correspond to each of the strings.
// Comparing CollationKeys is much quicker than comparing Strings
CollationKey[] b = new CollationKey[a.length];
for(int i = 0; i < a.length; i++) b[i] = c.getCollationKey(a[i]);
// Now define a Comparer object to compare collation keys, using an
// anonymous class.
Comparer comp = new Comparer() {
public int compare(Object a, Object b) {
return ((CollationKey)a).compareTo((CollationKey)b);
}
};
// Finally, sort the array of CollationKey objects, rearranging the
// original array of strings in exactly the same way.
sort(b, a, from, to, up, comp);
| public static void | sort(Sorter$Comparable[] a)Sort an array of Comparable objects into ascending order
sort(a, null, 0, a.length-1, true);
| public static void | sort(Sorter$Comparable[] a, int from, int to, boolean up)Sort a portion of an array of Comparable objects. If up is true,
sort into ascending order, otherwise sort into descending order.
sort(a, null, from, to, up, comparable_comparer);
| public static void | sortAscii(java.lang.String[] a)Sort an array of ASCII strings into ascending order
// Note use of the ascii_comparer object
sort(a, null, 0, a.length-1, true, ascii_comparer);
| public static void | sortAscii(java.lang.String[] a, int from, int to, boolean up)Sort a portion of an array of ASCII strings into ascending or descending
order, depending on the argument up
// Note use of the ascii_comparer object
sort(a, null, from, to, up, ascii_comparer);
| public static void | sortAsciiIgnoreCase(java.lang.String[] a)Sort an array of ASCII strings into ascending order, ignoring case
sortAsciiIgnoreCase(a, 0, a.length-1, true);
| public static void | sortAsciiIgnoreCase(java.lang.String[] a, int from, int to, boolean up)Sort an portion of an array of ASCII strings, ignoring case. Sort into
ascending order if up is true, otherwise sort into descending order.
if ((a == null) || (a.length < 2)) return;
// Create a secondary array of strings that contains lowercase versions
// of all the specified strings.
String b[] = new String[a.length];
for(int i = 0; i < a.length; i++) b[i] = a[i].toLowerCase();
// Sort that secondary array, and rearrange the original array
// in exactly the same way, resulting in a case-insensitive sort.
// Note the use of the ascii_comparer object
sort(b, a, from, to, up, ascii_comparer);
|
|