001 /* 002 * LAPIS lightweight structured text processing system 003 * 004 * Copyright (C) 1998-2002 Carnegie Mellon University, 005 * Copyright (C) 2003 Massachusetts Institute of Technology. 006 * All rights reserved. 007 * 008 * This library is free software; you can redistribute it 009 * and/or modify it under the terms of the GNU General 010 * Public License as published by the Free Software 011 * Foundation, version 2. 012 * 013 * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/ 014 */ 015 016 017 package lapisx.util; 018 019 /** 020 * String which compares case-insensitively with other strings. 021 * Especially useful as a case-insensitive hashtable key. 022 */ 023 public class CaselessString { 024 String string; 025 026 public CaselessString (String string) { 027 this.string = string; 028 } 029 030 public boolean equals (Object obj) { 031 if (obj instanceof String 032 || obj instanceof CaselessString) 033 return string.equalsIgnoreCase (obj.toString ()); 034 else 035 return false; 036 } 037 038 public int hashCode() { 039 int hash = 0; 040 int len = string.length (); 041 042 if (len < 16) { 043 // use all characters 044 for (int i = 0; i < len; ++i) 045 hash = (hash * 37) + Character.toUpperCase (string.charAt (i)); 046 } else { 047 int skip = len / 8; // sample every 8th char 048 for (int i = 0; i < len; i += skip) 049 hash = (hash * 39) + Character.toUpperCase (string.charAt (i)); 050 } 051 052 return hash; 053 } 054 055 public String toString () { 056 return string; 057 } 058 }