1 ////////////////////////////////////////////
3 // A MultiKey is a vector of Objects that
4 // serves as a key. One MultiKey is equal
5 // to another if they have the same number
6 // of Objects, and Objects in corresponding
7 // positions are equal.
9 ////////////////////////////////////////////
13 public class MultiKey {
15 static public MultiKey factory( Object... keys ) {
16 return new MultiKey( keys );
20 private Object[] keys;
22 public MultiKey( Object[] keys ) {
23 if( keys.length == 0 ) {
24 throw new IllegalArgumentException( "A MultiKey must have at least one key." );
26 for( int i = 0; i < keys.length; ++i ) {
27 if( keys[i] == null ) {
28 throw new IllegalArgumentException( "A MultiKey cannot have null elements." );
31 this.keys = keys.clone();
34 public boolean typesMatch( Class[] keyTypes ) {
35 if( keys.length != keyTypes.length ) {
38 for( int i = 0; i < keys.length; ++i ) {
39 if( !(keyTypes[i].isInstance( keys[i] )) ) {
46 public Object get( int index ) {
47 if( index < 0 || index >= keys.length ) {
48 throw new IllegalArgumentException( "Index "+index+" is out of range for this MultiKey." );
53 public boolean equals( Object o ) {
60 if( !(o instanceof MultiKey) ) {
63 MultiKey mk = (MultiKey) o;
64 if( this.keys.length != mk.keys.length ) {
67 for( int i = 0; i < keys.length; ++i ) {
68 if( !this.keys[i].equals( mk.keys[i] ) ) {
75 public int hashCode() {
77 for( Object key : keys ) {
78 hash = hash*31 + key.hashCode();
83 public String toString() {
84 StringBuilder s = new StringBuilder( "MK[" );
85 for( int i = 0; i < keys.length; ++i ) {
86 s.append( keys[i].toString() );
87 if( i < keys.length - 1 ) {