ArrayMap.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:5k
源码类别:

游戏

开发平台:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3.     Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  4.                        Matthias Butz <matze@odinms.de>
  5.                        Jan Christian Meyer <vimes@odinms.de>
  6.     This program is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU Affero General Public License version 3
  8.     as published by the Free Software Foundation. You may not use, modify
  9.     or distribute this program under any other version of the
  10.     GNU Affero General Public License.
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU Affero General Public License for more details.
  15.     You should have received a copy of the GNU Affero General Public License
  16.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. package net.sf.odinms.tools;
  19. import java.io.Serializable;
  20. import java.util.AbstractMap;
  21. import java.util.AbstractSet;
  22. import java.util.ArrayList;
  23. import java.util.Iterator;
  24. import java.util.Map;
  25. import java.util.Set;
  26. /**
  27.  * Provides a strongly-typed map of keys to values.
  28.  * 
  29.  * @author Frz
  30.  * @since Revision 589
  31.  * @version 1.0
  32.  * 
  33.  * @param <K> The type of the keys.
  34.  * @param <V> The type of the values.
  35.  */
  36. public class ArrayMap<K, V> extends AbstractMap<K, V> implements Serializable {
  37. static final long serialVersionUID = 9179541993413738569L;
  38. /**
  39.  * Provides a strongly typed mapping of a key to a value.
  40.  * 
  41.  * @author Frz
  42.  * @since Revision 589
  43.  * @version 1.0
  44.  * 
  45.  * @param <K> The type of the key.
  46.  * @param <V> The type of the value.
  47.  */
  48. static class Entry<K, V> implements Map.Entry<K, V>, Serializable {
  49. static final long serialVersionUID = 9179541993413738569L;
  50. protected K key;
  51. protected V value;
  52. /**
  53.  * Class constructor
  54.  * 
  55.  * @param key Name of the key
  56.  * @param value The value.
  57.  */
  58. public Entry(K key, V value) {
  59. this.key = key;
  60. this.value = value;
  61. }
  62. /**
  63.  * Gets the key.
  64.  * 
  65.  * @return The key.
  66.  */
  67. public K getKey() {
  68. return key;
  69. }
  70. /**
  71.  * Gets the value.
  72.  * 
  73.  * @return The value.
  74.  */
  75. public V getValue() {
  76. return value;
  77. }
  78. /**
  79.  * Sets a new value.
  80.  * 
  81.  * @return The old value.
  82.  */
  83. public V setValue(V newValue) {
  84. V oldValue = value;
  85. value = newValue;
  86. return oldValue;
  87. }
  88. /**
  89.  * Compares two Entries for equality.
  90.  * 
  91.  * @return <code>True</code> if the two Entries are equal,
  92.  *         <code>False</code> otherwise.
  93.  */
  94. @Override
  95. @SuppressWarnings("unchecked")
  96. public boolean equals(Object o) {
  97. if (!(o instanceof Map.Entry)) {
  98. return false;
  99. }
  100. Map.Entry e = (Map.Entry) o;
  101. return (key == null ? e.getKey() == null : key.equals(e.getKey())) &&
  102. (value == null ? e.getValue() == null : value.equals(e.getValue()));
  103. }
  104. /**
  105.  * @see java.lang.Object#hashCode()
  106.  */
  107. @Override
  108. public int hashCode() {
  109. int keyHash = (key == null ? 0 : key.hashCode());
  110. int valueHash = (value == null ? 0 : value.hashCode());
  111. return keyHash ^ valueHash;
  112. }
  113. /**
  114.  * @see java.lang.Object#toString()
  115.  */
  116. @Override
  117. public String toString() {
  118. return key + "=" + value;
  119. }
  120. }
  121. private Set<? extends java.util.Map.Entry<K, V>> entries = null;
  122. private ArrayList<Entry<K, V>> list;
  123. /**
  124.  * Class constructor
  125.  */
  126. public ArrayMap() {
  127. list = new ArrayList<Entry<K, V>>();
  128. }
  129. /**
  130.  * Class constructor.
  131.  * 
  132.  * @param map The <code>java.util.Map</code> containing keys and values to
  133.  *            import.
  134.  */
  135. public ArrayMap(Map<K, V> map) {
  136. list = new ArrayList<Entry<K, V>>();
  137. putAll(map);
  138. }
  139. /**
  140.  * Class constructor.
  141.  * 
  142.  * @param initialCapacity The initial size of the ArrayMap.
  143.  */
  144. public ArrayMap(int initialCapacity) {
  145. list = new ArrayList<Entry<K, V>>(initialCapacity);
  146. }
  147. /**
  148.  * Returns a set of entries in this ArrayList.
  149.  * 
  150.  * @return The entries in a <code>java.util.Set</code> instance.
  151.  */
  152. @Override
  153. @SuppressWarnings("unchecked")
  154. public Set<java.util.Map.Entry<K, V>> entrySet() {
  155. if (entries == null) {
  156. entries = new AbstractSet<Entry<K, V>>() {
  157. @Override
  158. public void clear() {
  159. throw new UnsupportedOperationException();
  160. }
  161. @Override
  162. public Iterator<Entry<K, V>> iterator() {
  163. return list.iterator();
  164. }
  165. @Override
  166. public int size() {
  167. return list.size();
  168. }
  169. };
  170. }
  171. return (Set<java.util.Map.Entry<K, V>>) entries;
  172. }
  173. /**
  174.  * Puts a key/value pair into the ArrayMap.
  175.  * 
  176.  * @param key The key of <code>value</code>
  177.  * @param value The value to insert into the ArrayMap.
  178.  * @return <code>null</code> if no entry was replaced, the value replaced
  179.  *         otherwise.
  180.  */
  181. @Override
  182. public V put(K key, V value) {
  183. int size = list.size();
  184. Entry<K, V> entry = null;
  185. int i;
  186. if (key == null) {
  187. for (i = 0; i < size; i++) {
  188. entry = (list.get(i));
  189. if (entry.getKey() == null) {
  190. break;
  191. }
  192. }
  193. } else {
  194. for (i = 0; i < size; i++) {
  195. entry = (list.get(i));
  196. if (key.equals(entry.getKey())) {
  197. break;
  198. }
  199. }
  200. }
  201. V oldValue = null;
  202. if (i < size) {
  203. oldValue = entry.getValue();
  204. entry.setValue(value);
  205. } else {
  206. list.add(new Entry<K, V>(key, value));
  207. }
  208. return oldValue;
  209. }
  210. }