/**
*******************************************************************************
* Copyright (C) 1996-2005, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
*
*******************************************************************************
*/
package com.ibm.icu4jni.text;
/**
* Collation key wrapper, containing the byte array sort key.
* @author syn wee quek
* @stable ICU 2.4
*/
public final class CollationKey implements Comparable
{
// public methods -----------------------------------------------
/**
* Bitwise comparison for the collation keys
* @param target CollationKey to be compared
* @return comparison result from Collator, RESULT_LESS, RESULT_EQUAL,
* RESULT_GREATER
* @stable ICU 2.4
*/
public int compareTo(CollationKey target)
{
byte tgtbytes[] = target.m_bytes_;
if (m_bytes_ == null || m_bytes_.length == 0) {
if (tgtbytes == null || tgtbytes.length == 0) {
return Collator.RESULT_EQUAL;
}
return Collator.RESULT_LESS;
}
else {
if (tgtbytes == null || tgtbytes.length == 0) {
return Collator.RESULT_GREATER;
}
}
int count = m_bytes_.length;
if (tgtbytes.length < count) {
count = tgtbytes.length;
}
int s,
t;
for (int i = 0; i < count; i ++)
{
// unable to use Arrays.equals
s = m_bytes_[i] & UNSIGNED_BYTE_MASK_;
t = tgtbytes[i] & UNSIGNED_BYTE_MASK_;
if (s < t) {
return Collator.RESULT_LESS;
}
if (s > t) {
return Collator.RESULT_GREATER;
}
}
if (m_bytes_.length < target.m_bytes_.length) {
return Collator.RESULT_LESS;
}
if (m_bytes_.length > target.m_bytes_.length) {
return Collator.RESULT_GREATER;
}
return Collator.RESULT_EQUAL;
}
/**
* Bitwise comparison for the collation keys.
* Argument is casted to CollationKey
* @param target CollationKey to be compared
* @return comparison result from Collator, RESULT_LESS, RESULT_EQUAL,
* RESULT_GREATER
* @stable ICU 2.4
*/
public int compareTo(Object target)
{
return compareTo((CollationKey)target);
}
/**
* Checks if target object is equal to this object.
* Target is first casted to CollationKey and bitwise compared.
* @param target comparison object
* @return true if both objects are equal, false otherwise
* @stable ICU 2.4
*/
public boolean equals(Object target)
{
if (this == target) {
return true;
}
// checks getClass here since CollationKey is final not subclassable
if (target == null || target.getClass() != getClass()) {
return false;
}
return compareTo((CollationKey)target) == Collator.RESULT_EQUAL;
}
/**
* Creates a hash code for this CollationKey.
* Compute the hash by iterating sparsely over about 32 (up to 63) bytes
* spaced evenly through the string. For each byte, multiply the previous
* hash value by a prime number and add the new byte in, like a linear
* congruential random number generator, producing a pseudorandom
* deterministic value well distributed over the output range.
* @return hash value of collation key. Hash value is never 0.
* @stable ICU 2.4
*/
public int hashCode()
{
if (m_hash_ == 0)
{
if (m_bytes_ != null || m_bytes_.length != 0)
{
int len = m_bytes_.length;
int inc = ((len - 32) / 32) + 1;
for (int i = 0; i < len;)
{
m_hash_ = (m_hash_ * 37) + m_bytes_[i];
i += inc;
}
}
if (m_hash_ == 0)
m_hash_ = 1;
}
return m_hash_;
}
/**
* Create the value of the Collation key in term of bytes
* @return value of Collation key in bytes
* @stable ICU 2.4
*/
public byte[] toByteArray()
{
if (m_bytes_ == null || m_bytes_.length == 0)
return null;
return (byte[])m_bytes_.clone();
}
// package constructors ----------------------------------------------
/**
* Default constructor, for use by the Collator and its subclasses.
*/
CollationKey()
{
m_hash_ = 0;
}
/**
* Constructor, for use only by the Collator and its subclasses.
*/
CollationKey(byte[] bytes)
{
m_bytes_ = bytes;
m_hash_ = 0;
}
// private data members -----------------------------------------------
private byte m_bytes_[];
/**
* Mask value to retrieve a single unsigned byte
*/
private static final int UNSIGNED_BYTE_MASK_ = 0x00FF;
/**
* Cached hash value
*/
private int m_hash_;
}
|