summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.foundation/src/main/java/net/wotonomy/foundation/internal/QueueMap.java
diff options
context:
space:
mode:
Diffstat (limited to 'projects/net.wotonomy.foundation/src/main/java/net/wotonomy/foundation/internal/QueueMap.java')
-rw-r--r--projects/net.wotonomy.foundation/src/main/java/net/wotonomy/foundation/internal/QueueMap.java996
1 files changed, 483 insertions, 513 deletions
diff --git a/projects/net.wotonomy.foundation/src/main/java/net/wotonomy/foundation/internal/QueueMap.java b/projects/net.wotonomy.foundation/src/main/java/net/wotonomy/foundation/internal/QueueMap.java
index 6d35b7b..59104e5 100644
--- a/projects/net.wotonomy.foundation/src/main/java/net/wotonomy/foundation/internal/QueueMap.java
+++ b/projects/net.wotonomy.foundation/src/main/java/net/wotonomy/foundation/internal/QueueMap.java
@@ -21,518 +21,488 @@ package net.wotonomy.foundation.internal;
import java.util.*; //collections
/**
-* A queue based implementation of the Map interface. This class provides for
-* all the opertions of a map, but keeps the entries in the same sequence as
-* originally added. The first entry placed in the map will be the first
-* entry retreived during iteration: first-in, first-out (FIFO). <BR><BR>
-*
-* Keys cannot be duplicated. If an entry is made using a key that already
-* exists, the value for that key will be replaced with that new value. There
-* are no such restrictions on the values. The values may be null. <BR><BR>
-*
-* Some convenience methods are provided for the queue type operations. The
-* first key can be retreived as well as the last key. A key can be used
-* to retreive its corresponding value from the map. A value can also be used
-* to retreive its key from the map, however, since there may be multiple values
-* of the same equality, the first key found will be returned. <BR><BR>
-*
-* @author rglista@blacksmith.com
-* @author mpowers@blacksmith.com
-* @date $Date: 2006-02-18 17:41:36 -0500 (Sat, 18 Feb 2006) $
-* @revision $Revision: 899 $
-*/
-public class QueueMap implements Map
-{
- List values;
- List keys;
- Map keyToValue;
-
-/**
-* Creates an empty QueueMap.
-*/
- public QueueMap()
- {
- values = new LinkedList();
- keys = new LinkedList();
- keyToValue = new HashMap();
- }
-
-/**
-* Creates a QueueMap and places the entries from the passed in map into this map.
-* The order of the entries is based on however the iterator iteratated through
-* the map entries.
-* @param t A map object.
-*/
- public QueueMap( Map t )
- {
- values = new ArrayList();
- keys = new ArrayList();
- keyToValue = new HashMap();
-
- putAll( t );
- }
-
-/**
-* Removes all the entries from this map.
-*/
- public void clear()
- {
- values.clear();
- keys.clear();
- keyToValue.clear();
- }
-
-/**
-* Tests to see if the key is contained in the map. If the key is present in
-* the map, then TRUE is returned, otherwise FALSE is returned. The equals()
-* operation is used to determine equality.
-* @return True if the map contains the given key, false otherwise.
-*/
- public boolean containsKey( Object key )
- {
- return keyToValue.containsKey( key );
- }
-
-/**
-* Tests to see if the value is contained in the map. If the value is present in
-* the map, then TRUE is returned, otherwise FALSE is returned. The equals()
-* operation is used to determine equality. The value can be null and will
-* return TRUE if null is a value in the map. If TRUE is returned, then there
-* may be more than one values in the map.
-* @return True if the map contains the given value, false otherwise.
-*/
- public boolean containsValue( Object value )
- {
- return keyToValue.containsValue( value );
- }
-
-/**
-* Returns a set view of the mappings contained in this map. Each element
-* in the returned set is a <tt>Map.Entry</tt>. The returned set is NOT backed
-* by the map, so changes to the map are NOT reflected in the set, and vice-versa.
-* The returned set is independent of this Map and its underlying structure.
-*
-* @return a set view of the mappings contained in this map.
-*/
- public Set entrySet()
- {
- Set result = new HashSet(keys.size(), 1F);
-
- for ( int i = 0; i < keys.size(); i++ )
- {
- result.add( new KeyValuePair( keys.get(i), values.get(i) ) );
- }
-
- return result;
- }
-
-/**
-* Compares the specified object with this map for equality. Returns
-* <tt>true</tt> if the given object is also a map and the two Maps
-* represent the same mappings. More formally, two maps <tt>t1</tt> and
-* <tt>t2</tt> represent the same mappings if
-* <tt>t1.entrySet().equals(t2.entrySet())</tt>. This ensures that the
-* <tt>equals</tt> method works properly across different implementations
-* of the <tt>Map</tt> interface.
-*
-* @param o object to be compared for equality with this map.
-* @return <tt>true</tt> if the specified object is equal to this map.
-*/
- public boolean equals( Object o )
- {
- return keyToValue.equals( o );
- }
-
-/**
-* Returns the corresponding value for the given key. The returned value may be
-* null as that is a legal value in this map. However, if the key is not
-* contained in this map then null is also returned. Use the containsKey()
-* method to distinguish between the two cases.
-* @param key A key into the map.
-* @return The value corresponding to the key (can be null), or null if the key
-* is not contained in the map.
-*/
- public Object get( Object key )
- {
- return keyToValue.get( key );
- }
-
-/**
-* Returns the hash code value for this map. The hash code of a map
-* is defined to be the sum of the hashCodes of each entry in the map's
-* entrySet view. This ensures that <tt>t1.equals(t2)</tt> implies
-* that <tt>t1.hashCode()==t2.hashCode()</tt> for any two maps
-* <tt>t1</tt> and <tt>t2</tt>, as required by the general
-* contract of Object.hashCode.
-*
-* @return the hash code value for this map.
-*/
- public int hashCode()
- {
- return keyToValue.hashCode();
- }
-
-/**
-* Returns true is this map contains no key-value mappings.
-* @return True is this map contains no entries, false otherwise.
-*/
- public boolean isEmpty()
- {
- return keyToValue.isEmpty();
- }
-
-/**
-* Returns the keys used in the map. There is no order implied in the returned
-* set and may be different than the the order in which they were inserted.
-* @return A Set containing all the keys used in the map.
-*/
- public Set keySet()
- {
- Set result = new HashSet(keys.size(), 1F);
-
- for ( int i = 0; i < keys.size(); i++ )
- {
- result.add( keys.get(i) );
- }
-
- return result;
- }
-
-/**
-* Places the key/value entry into the map at the end position. If the key
-* already exists in the map, then its value is replaced by the new given
-* value. The mapping does not change order in this case. The specified
-* key cannot be null.
-* @param key The key to place into the map, cannot be null.
-* @param value The value to associate with the key, may be null.
-* @return Null if the key is new, the replaced value if the key already
-* existed. (Note: If the key was null, then null is returned.)
-*/
- public Object put( Object key, Object value )
- {
- if ( key == null ) return null;
-
- if ( keys.contains( key ) )
- {
- values.remove( keys.indexOf( key ) );
- values.add( keys.indexOf( key ), value );
- }
- else
- {
- values.add( value );
- keys.add( key );
- }
-
- return keyToValue.put( key, value );
- }
-
-/**
-* Places all the entries from this given map into this map. If the keys
-* already exist, then there values are replaced.
-* @param t A map of key/value entries.
-*/
- public void putAll( Map t )
- {
- if ( t == null )
- {
- // Nothing to do!
- return;
- }
-
- // Place the entries from the passed in map into this map.
- for ( Iterator it = t.keySet().iterator(); it.hasNext(); )
- {
- Object aKey = it.next();
- put( aKey, t.get( aKey ) );
- }
- }
-
-/**
-* Remove the mapping of the key and associated value from this map.
-* Note: null is a valid value in the map.
-* @param key A key to remove from the map, cannot be null.
-* @return The value of the removed mapping, null if the mapping did not exist.
-* Null could also be returned if the associated value of the key was null.
-*/
- public Object remove( Object key )
- {
- if ( key == null ) return null;
-
- Object value = null;
-
- if ( containsKey( key ) )
- {
- value = keyToValue.remove( key );
- int i = values.indexOf( value );
- if ( i != -1 )
- {
- keys.remove( i );
- values.remove( i );
- }
- }
-
- return value;
- }
-
-/**
-* Returns the number of key/value pairs in this map.
-* @return The number of pairs.
-*/
- public int size()
- {
- return values.size();
- }
-
-/**
-* Returns an ordered list of keys from the map. The order is the same
-* as the added order of the mapped items.<br>
-* NOTE: The returned list is the underlying keys list used by this class.
-* If modification are to be made to this list, it should be cloned first.
-* @return An ordered list of keys.
-*/
- public List keys()
- {
- return keys;
- }
-
-/**
-* Returns an ordered list of values from the map. The order is the same
-* as the added order of the mapped items.
-* NOTE: The returned list is the underlying keys list used by this class.
-* If modification are to be made to this list, it should be cloned first.
-* @return An ordered list of values.
-*/
- public Collection values()
- {
- return values;
- }
-
-/**
-* Returns the corresponding value for the given key. The returned value may be
-* null as that is a legal value in this map. However, if the key is not
-* contained in this map then null is also returned. Use the containsKey()
-* method to distinguish between the two cases.
-* @param key A key into the map.
-* @return The value corresponding to the key (can be null), or null if the key
-* is not contained in the map.
-*/
- public Object getValueForKey( Object key )
- {
- return keyToValue.get( key );
- }
-
-/**
-* Returns the associated key for this value. Since there may be more than one
-* of the same value in the map, this returns the first key associated with this
-* value. Null is returned if the value is not in the map.
-* @param value A value that is contained in this map.
-* @return A first key that corresponds to this value.
-*/
- public Object getKeyForValue( Object value )
- {
- int i = values.indexOf( value );
- if ( i != -1 )
- {
- return keys.get( i );
- }
- return null;
- }
-
-/**
-* Returns the first key in the map. If the map is empty, then null is
-* returned.
-* @return The first key in the map, null if there are no mappings.
-*/
- public Object getFirstKey()
- {
- if ( keys.size() < 1 )
- {
- return null;
- }
- return keys.get(0);
- }
-
-/**
-* Returns the last key in the map. If the map is empty, then null is
-* returned.
-* @return The last key in the map, null if there are no mappings.
-*/
- public Object getLastKey()
- {
- if ( keys.size() < 1 )
- {
- return null;
- }
- return keys.get( keys.size() -1 );
- }
-
-/**
-* This class contains a key/value pair. The key must be a valid object,
-* it cannot be null. The value can be a valid object or null.
-*/
- static public class KeyValuePair implements Map.Entry
- {
- Object key;
- Object value;
-
- /**
- * Default constructor. The constructor takes the key and value as parameters.
- * Since the key cannot be null, it must be specified during initialization.
- * The value can be null.
- * @param key The key object of this pair. The key cannot be null.
- * @param value The value object of this pair. The value can be null.
- */
- public KeyValuePair( Object aKey, Object aValue )
- {
- key = aKey;
- value = aValue;
- }
-
- /**
- * Returns the key object of this pair.
- * @return The key object.
- */
- public Object getKey()
- {
- return key;
- }
-
- /**
- * Returns the the value object of this pair. May be null.
- * @return The value object.
- */
- public Object getValue()
- {
- return value;
- }
-
- /**
- * Sets the value object of this pair. May be an object or null.
- * @param aValue The value object to place into this pair.
- */
- public Object setValue( Object aValue )
- {
- Object result = value;
- value = aValue;
- return result;
- }
-
- public boolean equals( Object o )
- {
- if ( o instanceof KeyValuePair )
- {
- KeyValuePair p = (KeyValuePair) o;
- if ( ( key.equals( p.getKey() ) ) && ( value.equals( p.getValue() ) ) )
- {
- return true;
- }
- }
- return false;
- }
- }
-
- /**
- * Returns a string reprsentation of this class. The contents of the
- * map are placed in the string in its proper order.
- */
- public String toString()
- {
- int max = size() - 1;
- StringBuffer buf = new StringBuffer();
-
- buf.append("{");
- for (int j = 0; j <= max; j++)
- {
- buf.append(keys.get(j) + "=" + values.get(j));
- if (j < max)
- {
- buf.append(", ");
- }
- }
- buf.append("}");
-
- return buf.toString();
- }
-
- // unit test
- public static void main( String[] argv )
- {
- QueueMap qMap;
-
- qMap = new QueueMap();
- for (int i = 0; i < 5; i++)
- {
- qMap.put(Integer.toString(i), Integer.toString(i));
- }
- System.out.println("\nMap = " + qMap);
- System.out.println("Keys = " + qMap.keys());
- System.out.println("Values = " + qMap.values());
-
- qMap = new QueueMap();
- for (int i = 0; i < 5; i++)
- {
- qMap.put(Integer.toString(i), "A");
- }
- System.out.println("\nMap = " + qMap);
- System.out.println("Keys = " + qMap.keys());
- System.out.println("Values = " + qMap.values());
-
- qMap = new QueueMap();
- for (int i = 0; i < 5; i++)
- {
- qMap.put(Integer.toString(i), null);
- }
- System.out.println("\nMap = " + qMap);
- System.out.println("Keys = " + qMap.keys());
- System.out.println("Values = " + qMap.values());
-
- Map aMap = new HashMap();
- for (int i = 0; i < 5; i++)
- {
- aMap.put(Integer.toString(i), Integer.toString(i));
- }
- qMap = new QueueMap( aMap );
- System.out.println("\nHashMap = " + aMap);
- System.out.println("Map = " + qMap);
- System.out.println("Keys = " + qMap.keys());
- System.out.println("Values = " + qMap.values());
-
- qMap = new QueueMap();
- qMap.put( "Test1", "String1" );
- qMap.put( "Test2", "String2" );
- qMap.put( "Test3", "String3" );
- qMap.put( "Test4", "String4" );
- qMap.put( "Test5", "String5" );
- System.out.println("\nStandard Test, Map = " + qMap);
- qMap.put( "Test6", "String6" );
- qMap.put( "Test7", "String7" );
- System.out.println("Put New Test, Map = " + qMap);
- qMap.put( "Test2", "New String2" );
- qMap.put( "Test6", "New String6" );
- System.out.println("Put Existing Test, Map = " + qMap);
- qMap.put( "Test5", null );
- qMap.put( "Test8", null );
- System.out.println("Put Null Test, Map = " + qMap);
- qMap.remove( "Test1" );
- qMap.remove( "Test3" );
- qMap.remove( "Test5" );
- qMap.remove( "Test9" );
- System.out.println("Remove Test, Map = " + qMap);
- System.out.println(" Keys = " + qMap.keys());
- System.out.println(" Values = " + qMap.values());
- qMap.clear();
- qMap.put( "Test10", "String10" );
- qMap.put( "Test11", "String11" );
- qMap.put( "Test12", "String12" );
- System.out.println("Clear Test, Map = " + qMap);
-
- aMap = new HashMap();
- aMap.put( "Test10", "String10" );
- aMap.put( "Test11", "String11" );
- aMap.put( "Test12", "String12" );
- System.out.println("Equality Test, Equal = " + qMap.equals( aMap ));
- }
+ * A queue based implementation of the Map interface. This class provides for
+ * all the opertions of a map, but keeps the entries in the same sequence as
+ * originally added. The first entry placed in the map will be the first entry
+ * retreived during iteration: first-in, first-out (FIFO). <BR>
+ * <BR>
+ *
+ * Keys cannot be duplicated. If an entry is made using a key that already
+ * exists, the value for that key will be replaced with that new value. There
+ * are no such restrictions on the values. The values may be null. <BR>
+ * <BR>
+ *
+ * Some convenience methods are provided for the queue type operations. The
+ * first key can be retreived as well as the last key. A key can be used to
+ * retreive its corresponding value from the map. A value can also be used to
+ * retreive its key from the map, however, since there may be multiple values of
+ * the same equality, the first key found will be returned. <BR>
+ * <BR>
+ *
+ * @author rglista@blacksmith.com
+ * @author mpowers@blacksmith.com
+ * @date $Date: 2006-02-18 17:41:36 -0500 (Sat, 18 Feb 2006) $
+ * @revision $Revision: 899 $
+ */
+public class QueueMap implements Map {
+ List values;
+ List keys;
+ Map keyToValue;
+
+ /**
+ * Creates an empty QueueMap.
+ */
+ public QueueMap() {
+ values = new LinkedList();
+ keys = new LinkedList();
+ keyToValue = new HashMap();
+ }
+
+ /**
+ * Creates a QueueMap and places the entries from the passed in map into this
+ * map. The order of the entries is based on however the iterator iteratated
+ * through the map entries.
+ *
+ * @param t A map object.
+ */
+ public QueueMap(Map t) {
+ values = new ArrayList();
+ keys = new ArrayList();
+ keyToValue = new HashMap();
+
+ putAll(t);
+ }
+
+ /**
+ * Removes all the entries from this map.
+ */
+ public void clear() {
+ values.clear();
+ keys.clear();
+ keyToValue.clear();
+ }
+
+ /**
+ * Tests to see if the key is contained in the map. If the key is present in the
+ * map, then TRUE is returned, otherwise FALSE is returned. The equals()
+ * operation is used to determine equality.
+ *
+ * @return True if the map contains the given key, false otherwise.
+ */
+ public boolean containsKey(Object key) {
+ return keyToValue.containsKey(key);
+ }
+
+ /**
+ * Tests to see if the value is contained in the map. If the value is present in
+ * the map, then TRUE is returned, otherwise FALSE is returned. The equals()
+ * operation is used to determine equality. The value can be null and will
+ * return TRUE if null is a value in the map. If TRUE is returned, then there
+ * may be more than one values in the map.
+ *
+ * @return True if the map contains the given value, false otherwise.
+ */
+ public boolean containsValue(Object value) {
+ return keyToValue.containsValue(value);
+ }
+
+ /**
+ * Returns a set view of the mappings contained in this map. Each element in the
+ * returned set is a <tt>Map.Entry</tt>. The returned set is NOT backed by the
+ * map, so changes to the map are NOT reflected in the set, and vice-versa. The
+ * returned set is independent of this Map and its underlying structure.
+ *
+ * @return a set view of the mappings contained in this map.
+ */
+ public Set entrySet() {
+ Set result = new HashSet(keys.size(), 1F);
+
+ for (int i = 0; i < keys.size(); i++) {
+ result.add(new KeyValuePair(keys.get(i), values.get(i)));
+ }
+
+ return result;
+ }
+
+ /**
+ * Compares the specified object with this map for equality. Returns
+ * <tt>true</tt> if the given object is also a map and the two Maps represent
+ * the same mappings. More formally, two maps <tt>t1</tt> and <tt>t2</tt>
+ * represent the same mappings if <tt>t1.entrySet().equals(t2.entrySet())</tt>.
+ * This ensures that the <tt>equals</tt> method works properly across different
+ * implementations of the <tt>Map</tt> interface.
+ *
+ * @param o object to be compared for equality with this map.
+ * @return <tt>true</tt> if the specified object is equal to this map.
+ */
+ public boolean equals(Object o) {
+ return keyToValue.equals(o);
+ }
+
+ /**
+ * Returns the corresponding value for the given key. The returned value may be
+ * null as that is a legal value in this map. However, if the key is not
+ * contained in this map then null is also returned. Use the containsKey()
+ * method to distinguish between the two cases.
+ *
+ * @param key A key into the map.
+ * @return The value corresponding to the key (can be null), or null if the key
+ * is not contained in the map.
+ */
+ public Object get(Object key) {
+ return keyToValue.get(key);
+ }
+
+ /**
+ * Returns the hash code value for this map. The hash code of a map is defined
+ * to be the sum of the hashCodes of each entry in the map's entrySet view. This
+ * ensures that <tt>t1.equals(t2)</tt> implies that
+ * <tt>t1.hashCode()==t2.hashCode()</tt> for any two maps <tt>t1</tt> and
+ * <tt>t2</tt>, as required by the general contract of Object.hashCode.
+ *
+ * @return the hash code value for this map.
+ */
+ public int hashCode() {
+ return keyToValue.hashCode();
+ }
+
+ /**
+ * Returns true is this map contains no key-value mappings.
+ *
+ * @return True is this map contains no entries, false otherwise.
+ */
+ public boolean isEmpty() {
+ return keyToValue.isEmpty();
+ }
+
+ /**
+ * Returns the keys used in the map. There is no order implied in the returned
+ * set and may be different than the the order in which they were inserted.
+ *
+ * @return A Set containing all the keys used in the map.
+ */
+ public Set keySet() {
+ Set result = new HashSet(keys.size(), 1F);
+
+ for (int i = 0; i < keys.size(); i++) {
+ result.add(keys.get(i));
+ }
+
+ return result;
+ }
+
+ /**
+ * Places the key/value entry into the map at the end position. If the key
+ * already exists in the map, then its value is replaced by the new given value.
+ * The mapping does not change order in this case. The specified key cannot be
+ * null.
+ *
+ * @param key The key to place into the map, cannot be null.
+ * @param value The value to associate with the key, may be null.
+ * @return Null if the key is new, the replaced value if the key already
+ * existed. (Note: If the key was null, then null is returned.)
+ */
+ public Object put(Object key, Object value) {
+ if (key == null)
+ return null;
+
+ if (keys.contains(key)) {
+ values.remove(keys.indexOf(key));
+ values.add(keys.indexOf(key), value);
+ } else {
+ values.add(value);
+ keys.add(key);
+ }
+
+ return keyToValue.put(key, value);
+ }
+
+ /**
+ * Places all the entries from this given map into this map. If the keys already
+ * exist, then there values are replaced.
+ *
+ * @param t A map of key/value entries.
+ */
+ public void putAll(Map t) {
+ if (t == null) {
+ // Nothing to do!
+ return;
+ }
+
+ // Place the entries from the passed in map into this map.
+ for (Iterator it = t.keySet().iterator(); it.hasNext();) {
+ Object aKey = it.next();
+ put(aKey, t.get(aKey));
+ }
+ }
+
+ /**
+ * Remove the mapping of the key and associated value from this map. Note: null
+ * is a valid value in the map.
+ *
+ * @param key A key to remove from the map, cannot be null.
+ * @return The value of the removed mapping, null if the mapping did not exist.
+ * Null could also be returned if the associated value of the key was
+ * null.
+ */
+ public Object remove(Object key) {
+ if (key == null)
+ return null;
+
+ Object value = null;
+
+ if (containsKey(key)) {
+ value = keyToValue.remove(key);
+ int i = values.indexOf(value);
+ if (i != -1) {
+ keys.remove(i);
+ values.remove(i);
+ }
+ }
+
+ return value;
+ }
+
+ /**
+ * Returns the number of key/value pairs in this map.
+ *
+ * @return The number of pairs.
+ */
+ public int size() {
+ return values.size();
+ }
+
+ /**
+ * Returns an ordered list of keys from the map. The order is the same as the
+ * added order of the mapped items.<br>
+ * NOTE: The returned list is the underlying keys list used by this class. If
+ * modification are to be made to this list, it should be cloned first.
+ *
+ * @return An ordered list of keys.
+ */
+ public List keys() {
+ return keys;
+ }
+
+ /**
+ * Returns an ordered list of values from the map. The order is the same as the
+ * added order of the mapped items. NOTE: The returned list is the underlying
+ * keys list used by this class. If modification are to be made to this list, it
+ * should be cloned first.
+ *
+ * @return An ordered list of values.
+ */
+ public Collection values() {
+ return values;
+ }
+
+ /**
+ * Returns the corresponding value for the given key. The returned value may be
+ * null as that is a legal value in this map. However, if the key is not
+ * contained in this map then null is also returned. Use the containsKey()
+ * method to distinguish between the two cases.
+ *
+ * @param key A key into the map.
+ * @return The value corresponding to the key (can be null), or null if the key
+ * is not contained in the map.
+ */
+ public Object getValueForKey(Object key) {
+ return keyToValue.get(key);
+ }
+
+ /**
+ * Returns the associated key for this value. Since there may be more than one
+ * of the same value in the map, this returns the first key associated with this
+ * value. Null is returned if the value is not in the map.
+ *
+ * @param value A value that is contained in this map.
+ * @return A first key that corresponds to this value.
+ */
+ public Object getKeyForValue(Object value) {
+ int i = values.indexOf(value);
+ if (i != -1) {
+ return keys.get(i);
+ }
+ return null;
+ }
+
+ /**
+ * Returns the first key in the map. If the map is empty, then null is returned.
+ *
+ * @return The first key in the map, null if there are no mappings.
+ */
+ public Object getFirstKey() {
+ if (keys.size() < 1) {
+ return null;
+ }
+ return keys.get(0);
+ }
+
+ /**
+ * Returns the last key in the map. If the map is empty, then null is returned.
+ *
+ * @return The last key in the map, null if there are no mappings.
+ */
+ public Object getLastKey() {
+ if (keys.size() < 1) {
+ return null;
+ }
+ return keys.get(keys.size() - 1);
+ }
+
+ /**
+ * This class contains a key/value pair. The key must be a valid object, it
+ * cannot be null. The value can be a valid object or null.
+ */
+ static public class KeyValuePair implements Map.Entry {
+ Object key;
+ Object value;
+
+ /**
+ * Default constructor. The constructor takes the key and value as parameters.
+ * Since the key cannot be null, it must be specified during initialization. The
+ * value can be null.
+ *
+ * @param key The key object of this pair. The key cannot be null.
+ * @param value The value object of this pair. The value can be null.
+ */
+ public KeyValuePair(Object aKey, Object aValue) {
+ key = aKey;
+ value = aValue;
+ }
+
+ /**
+ * Returns the key object of this pair.
+ *
+ * @return The key object.
+ */
+ public Object getKey() {
+ return key;
+ }
+
+ /**
+ * Returns the the value object of this pair. May be null.
+ *
+ * @return The value object.
+ */
+ public Object getValue() {
+ return value;
+ }
+
+ /**
+ * Sets the value object of this pair. May be an object or null.
+ *
+ * @param aValue The value object to place into this pair.
+ */
+ public Object setValue(Object aValue) {
+ Object result = value;
+ value = aValue;
+ return result;
+ }
+
+ public boolean equals(Object o) {
+ if (o instanceof KeyValuePair) {
+ KeyValuePair p = (KeyValuePair) o;
+ if ((key.equals(p.getKey())) && (value.equals(p.getValue()))) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Returns a string reprsentation of this class. The contents of the map are
+ * placed in the string in its proper order.
+ */
+ public String toString() {
+ int max = size() - 1;
+ StringBuffer buf = new StringBuffer();
+
+ buf.append("{");
+ for (int j = 0; j <= max; j++) {
+ buf.append(keys.get(j) + "=" + values.get(j));
+ if (j < max) {
+ buf.append(", ");
+ }
+ }
+ buf.append("}");
+
+ return buf.toString();
+ }
+
+ // unit test
+ public static void main(String[] argv) {
+ QueueMap qMap;
+
+ qMap = new QueueMap();
+ for (int i = 0; i < 5; i++) {
+ qMap.put(Integer.toString(i), Integer.toString(i));
+ }
+ System.out.println("\nMap = " + qMap);
+ System.out.println("Keys = " + qMap.keys());
+ System.out.println("Values = " + qMap.values());
+
+ qMap = new QueueMap();
+ for (int i = 0; i < 5; i++) {
+ qMap.put(Integer.toString(i), "A");
+ }
+ System.out.println("\nMap = " + qMap);
+ System.out.println("Keys = " + qMap.keys());
+ System.out.println("Values = " + qMap.values());
+
+ qMap = new QueueMap();
+ for (int i = 0; i < 5; i++) {
+ qMap.put(Integer.toString(i), null);
+ }
+ System.out.println("\nMap = " + qMap);
+ System.out.println("Keys = " + qMap.keys());
+ System.out.println("Values = " + qMap.values());
+
+ Map aMap = new HashMap();
+ for (int i = 0; i < 5; i++) {
+ aMap.put(Integer.toString(i), Integer.toString(i));
+ }
+ qMap = new QueueMap(aMap);
+ System.out.println("\nHashMap = " + aMap);
+ System.out.println("Map = " + qMap);
+ System.out.println("Keys = " + qMap.keys());
+ System.out.println("Values = " + qMap.values());
+
+ qMap = new QueueMap();
+ qMap.put("Test1", "String1");
+ qMap.put("Test2", "String2");
+ qMap.put("Test3", "String3");
+ qMap.put("Test4", "String4");
+ qMap.put("Test5", "String5");
+ System.out.println("\nStandard Test, Map = " + qMap);
+ qMap.put("Test6", "String6");
+ qMap.put("Test7", "String7");
+ System.out.println("Put New Test, Map = " + qMap);
+ qMap.put("Test2", "New String2");
+ qMap.put("Test6", "New String6");
+ System.out.println("Put Existing Test, Map = " + qMap);
+ qMap.put("Test5", null);
+ qMap.put("Test8", null);
+ System.out.println("Put Null Test, Map = " + qMap);
+ qMap.remove("Test1");
+ qMap.remove("Test3");
+ qMap.remove("Test5");
+ qMap.remove("Test9");
+ System.out.println("Remove Test, Map = " + qMap);
+ System.out.println(" Keys = " + qMap.keys());
+ System.out.println(" Values = " + qMap.values());
+ qMap.clear();
+ qMap.put("Test10", "String10");
+ qMap.put("Test11", "String11");
+ qMap.put("Test12", "String12");
+ System.out.println("Clear Test, Map = " + qMap);
+
+ aMap = new HashMap();
+ aMap.put("Test10", "String10");
+ aMap.put("Test11", "String11");
+ aMap.put("Test12", "String12");
+ System.out.println("Equality Test, Equal = " + qMap.equals(aMap));
+ }
}
-
-