/**
 * Implementation of a String wrapper to be used for testing
 * the Hash Table. Changes the default hash code implementation. 
 */

public class MyString
{
    /**
     * the string representative
     */
    private String str;

    /**
     * Creates a new string wrapper based on the given string.
     *
     * @param s   the string representative
     */
    public MyString(String s)
    {
        str = s;
    }

    /**
     * Returns a hash code for this string:
     * - if the string starts with a digit, the digit's multiple of 10
     *   is added to the length of the string (ignoring the digit)
     * - otherwise the length of the string is returned
     *
     * For example: "cat"=3, "1cat"=13, "2cat"=23, ..., "9cat"=93
     *
     * @return a hash code for this string
     */
    @Override
    public int hashCode()
    {
	char firstChar = str.charAt(0);
        if (Character.isDigit(firstChar)) {
	    int value = Character.getNumericValue(firstChar);
	    return  10*value + (str.length() - 1);
	}
	else {
	    return str.length();
	}
    }

    /**
     * Returns a string representation of this string.
     *
     * @return a string representation of this string
     */
    @Override
    public String toString()
    {
        return str;
    }

    /**
     * Checks if the given object is equal to this string wrapper.
     *
     * @param other   the object to compare with
     * @return true if the given object is equal to this string wrapper
     */
    @Override
    public boolean equals(Object other)
    {
        if (other == this) {
            return true;
        }
        else if ( !(other instanceof MyString) ) {
            return false;
        }
        else {
            MyString otherStr = (MyString) other;
            return this.str.equals(otherStr.str);
        }
    }
}