CollationKeyICU.java revision ebe438a0734f24ded1772778e5e712c820981234
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project******************************************************************************* 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* Copyright (C) 1996-2005, International Business Machines Corporation and * 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* others. All Rights Reserved. * 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project******************************************************************************* 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project******************************************************************************* 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/ 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage com.ibm.icu4jni.text; 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 14ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * A concrete implementation of the abstract java.text.CollationKey. 15ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes */ 16ebe438a0734f24ded1772778e5e712c820981234Elliott Hughespublic final class CollationKey extends java.text.CollationKey { 17ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes /** 18ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * The key. 19ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes */ 20ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes private final byte[] bytes; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 22ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes /** 23ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * Cached hash value. 24ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes */ 25ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes private int hashCode; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 27ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes CollationKey(String source, byte[] bytes) { 28ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes super(source); 29ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes this.bytes = bytes; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes public int compareTo(java.text.CollationKey other) { 33ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes // Get the bytes from the other collation key. 34ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes final byte[] rhsBytes; 35ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (other instanceof CollationKey) { 36ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes rhsBytes = ((CollationKey) other).bytes; 37ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } else { 38ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes rhsBytes = other.toByteArray(); 39ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (bytes == null || bytes.length == 0) { 42ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (rhsBytes == null || rhsBytes.length == 0) { 43ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return 0; 44ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 45ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return -1; 46ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } else { 47ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (rhsBytes == null || rhsBytes.length == 0) { 48ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return 1; 49ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 50ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 52ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes int count = Math.min(bytes.length, rhsBytes.length); 53ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes for (int i = 0; i < count; ++i) { 54ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes int s = bytes[i] & 0xff; 55ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes int t = rhsBytes[i] & 0xff; 56ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (s < t) { 57ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return -1; 58ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 59ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (s > t) { 60ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return 1; 61ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 62ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 63ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (bytes.length < rhsBytes.length) { 64ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return -1; 65ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 66ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (bytes.length > rhsBytes.length) { 67ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return 1; 68ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 69ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return 0; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes /** 73ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * Checks if target object is equal to this object. 74ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * Target is first casted to CollationKey and bitwise compared. 75ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * @param target comparison object 76ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * @return true if both objects are equal, false otherwise 77ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * @stable ICU 2.4 78ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes */ 79ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes public boolean equals(Object object) { 80ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (object == this) { 81ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return true; 82ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 83ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (!(object instanceof CollationKey)) { 84ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return false; 85ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 86ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return compareTo((CollationKey) object) == 0; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 89ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes /** 90ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * Creates a hash code for this CollationKey. 91ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * Compute the hash by iterating sparsely over about 32 (up to 63) bytes 92ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * spaced evenly through the string. For each byte, multiply the previous 93ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * hash value by a prime number and add the new byte in, like a linear 94ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * congruential random number generator, producing a pseudo-random 95ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * deterministic value well distributed over the output range. 96ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * @return hash value of collation key. Hash value is never 0. 97ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes * @stable ICU 2.4 98ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes */ 99ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes public int hashCode() { 100ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (hashCode == 0) { 101ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (bytes != null && bytes.length != 0) { 102ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes int len = bytes.length; 103ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes int inc = ((len - 32) / 32) + 1; 104ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes for (int i = 0; i < len;) { 105ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes hashCode = (hashCode * 37) + bytes[i]; 106ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes i += inc; 107ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 108ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 109ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (hashCode == 0) { 110ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes hashCode = 1; 111ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 112ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 113ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return hashCode; 114ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 116ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes public byte[] toByteArray() { 117ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes if (bytes == null || bytes.length == 0) { 118ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return null; 119ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 120ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes return bytes.clone(); 121ebe438a0734f24ded1772778e5e712c820981234Elliott Hughes } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 123