| // CollationKey.java - Sort key for locale-sensitive String. |
| |
| /* Copyright (C) 1999, 2000 Free Software Foundation |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| package java.text; |
| |
| /** |
| * @author Tom Tromey <tromey@cygnus.com> |
| * @date March 25, 1999 |
| */ |
| /* Written using "Java Class Libraries", 2nd edition, plus online |
| * API docs for JDK 1.2 from http://www.javasoft.com. |
| * Status: Believed complete and correct. |
| */ |
| |
| public final class CollationKey implements Comparable |
| { |
| public int compareTo (CollationKey target) |
| { |
| int max = Math.min(key.length, target.key.length); |
| |
| for (int i = 0; i < max; ++i) |
| { |
| if (key[i] != target.key[i]) |
| return key[i] - target.key[i]; |
| } |
| |
| return key.length - target.key.length; |
| } |
| |
| public int compareTo (Object o) |
| { |
| return compareTo ((CollationKey) o); |
| } |
| |
| public boolean equals (Object obj) |
| { |
| if (! (obj instanceof CollationKey)) |
| return false; |
| |
| CollationKey ck = (CollationKey) obj; |
| |
| if (key.length != ck.key.length) |
| return false; |
| |
| for (int i = 0; i < key.length; ++i) |
| if (key[i] != ck.key[i]) |
| return false; |
| |
| return true; |
| } |
| |
| public String getSourceString () |
| { |
| return originalText; |
| } |
| |
| public int hashCode () |
| { |
| // We just follow BitSet instead of thinking up something new. |
| long h = originalText.hashCode(); |
| for (int i = key.length - 1; i >= 0; --i) |
| h ^= key[i] * (i + 1); |
| return (int) ((h >> 32) ^ h); |
| } |
| |
| public byte[] toByteArray () |
| { |
| byte[] r = new byte[4 * key.length]; |
| int off = 0; |
| for (int i = 0; i < key.length; ++i) |
| { |
| r[off++] = (byte) ((key[i] >>> 24) & 255); |
| r[off++] = (byte) ((key[i] >>> 16) & 255); |
| r[off++] = (byte) ((key[i] >>> 8) & 255); |
| r[off++] = (byte) ((key[i] ) & 255); |
| } |
| return r; |
| } |
| |
| CollationKey (CollationElementIterator iter, String originalText, |
| int strength) |
| { |
| this.originalText = originalText; |
| |
| // Compute size of required array. |
| int size = 0; |
| while (RuleBasedCollator.next(iter, strength) |
| != CollationElementIterator.NULLORDER) |
| ++size; |
| |
| iter.reset(); |
| key = new int[size]; |
| for (int i = 0; i < size; i++) |
| key[i] = RuleBasedCollator.next(iter, strength); |
| } |
| |
| // Original string. |
| private String originalText; |
| |
| // Collation key. |
| private int[] key; |
| } |