Guest User

HashMap Casero

a guest
Apr 21st, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.22 KB | None | 0 0
  1. package hashmapsimple;
  2. import java.util.AbstractCollection;
  3. import java.util.AbstractSet;
  4. import java.util.Arrays;
  5. import java.util.Collection;
  6. import java.util.Iterator;
  7. import java.util.Map;
  8. import java.util.Set;
  9. public class MyMap<K, V> implements Map<K,V>{
  10. private int capacity;
  11. private int size;
  12. private static final int DEFAULT_SIZE = 8;
  13. private Entry<K,V>[] table;
  14. public MyMap() {
  15. this(DEFAULT_SIZE);
  16. }
  17. public MyMap(int xcapacity) {
  18. if(xcapacity <= 0){
  19. throw new IllegalArgumentException("Capacidad no permitida: " + capacity);
  20. } else {
  21. this.capacity = xcapacity;
  22. }
  23. this.clear();
  24. }
  25. public MyMap(Map<? extends K, ? extends V> m) {
  26. this.putAll(m);
  27. }
  28. @Override
  29. public V put(K key, V value) {
  30. if(key == null){
  31. return null;
  32. } else {
  33. int index = getIndex(key);
  34. System.out.println("indice -> "+ index);
  35. Entry<K, V> pair = table[index];
  36. if (pair != null && pair.getKey().equals(key)) {
  37. V oldValue = pair.getValue();
  38. pair.setValue(value);
  39. return oldValue;
  40. }
  41. setEntry(key, value, index);
  42. return value;
  43. }
  44. }
  45. @Override
  46. public V get(Object key) {
  47. return (this.getEntry(key) == null) ? null : this.getEntry(key).getValue();
  48. }
  49. @Override
  50. public boolean containsKey(Object key) {
  51. return this.getEntry(key) != null;
  52. }
  53. private Entry<K, V> getEntry(Object key) {
  54. for (int index = getIndex(key); index < capacity; index++) {
  55. Entry<K, V> pair = table[index];
  56. if (pair != null && pair.getKey().equals(key)){
  57. return pair;
  58. }
  59. }
  60. return null;
  61. }
  62. @Override
  63. public boolean containsValue(Object value){
  64. if(value != null){
  65. for (Entry tab : table) {
  66. if (tab != null && value.equals(tab.getValue())){
  67. return true;
  68. }
  69. }
  70. }
  71. return false;
  72. }
  73. @Override
  74. public int size() {
  75. return size;
  76. }
  77. @Override
  78. public boolean isEmpty(){
  79. return size == 0;
  80. }
  81. @Override
  82. public void clear() {
  83. table = new Entry[capacity];
  84. size = 0;
  85. }
  86.  
  87. @Override
  88. public V remove(Object key){
  89. int index = getIndex(key);
  90. Entry<K,V> e = table[index];
  91. if(e != null){
  92. for(;index < size; index++){
  93. table[index] = table[index + 1];
  94. }
  95. size--;
  96. return e.getValue();
  97. } else {
  98. return null;
  99. }
  100. }
  101. private int getIndex(Object key) {
  102. return (key.hashCode() & 0x7FFFFFFF) % table.length -1;
  103. }
  104.  
  105. private void setEntry(K key, V value, int index) {
  106. Entry<K, V> e = table[index];
  107. while (e != null) {
  108. index++;
  109. if (index >= capacity) {
  110. table = Arrays.copyOf(table, table.length +1);
  111. put(key,value);
  112. return;
  113. }
  114. e = table[index];
  115. }
  116. table[index] = new Entry(key, value);
  117. size++;
  118. }
  119.  
  120. /*-----------------------------------------------------------*/
  121. //@Override
  122. @Override
  123. public Set<K> keySet() {
  124. return new KeySet();
  125. }
  126.  
  127. @Override
  128. public void putAll(Map<? extends K, ? extends V> m) {
  129. if(m.size() > 0){
  130. m.entrySet().forEach((e) -> {
  131. this.put(e.getKey(), e.getValue());
  132. });
  133. }
  134. }
  135. /*-----------------------------------------------------------*/
  136. private class KeySet extends AbstractSet<K>{
  137. @Override
  138. public Iterator<K> iterator() {
  139. return new KeyIterator();
  140. }
  141. @Override
  142. public int size() {
  143. return size;
  144. }
  145. }
  146. private final class KeyIterator extends HashIterator<K> {
  147. @Override
  148. public K next() {
  149. return nextEntry().getKey();
  150. }
  151. }
  152. /*-----------------------------------------------------------*/
  153. @Override
  154. public Collection<V> values() {
  155. return new Values();
  156. }
  157. private class Values extends AbstractCollection<V>{
  158. @Override
  159. public Iterator<V> iterator() {
  160. return new ValueIterator();
  161. }
  162. @Override
  163. public int size() {
  164. return size;
  165. }
  166. }
  167. private final class ValueIterator extends HashIterator<V>{
  168. @Override
  169. public V next() {
  170. return nextEntry().getValue();
  171. }
  172. }
  173. /*-----------------------------------------------------------*/
  174. @Override
  175. public Set<Map.Entry<K, V>> entrySet() {
  176. return new EntrySet();
  177. }
  178. private class EntrySet extends AbstractSet<Map.Entry<K,V>> {
  179. @Override
  180. public Iterator<Map.Entry<K, V>> iterator() {
  181. return new EntryIterator();
  182. }
  183. @Override
  184. public int size() {
  185. return size;
  186. }
  187. }
  188. private final class EntryIterator extends HashIterator<Map.Entry<K,V>> {
  189. @Override
  190. public Entry<K, V> next() {
  191. return nextEntry();
  192. }
  193. }
  194. /*-----------------------------------------------------------*/
  195. private abstract class HashIterator<E> implements Iterator<E> {
  196. private int index;
  197. private Entry<K,V> currEntry;
  198. private Entry<K,V> nextEntry;
  199. @SuppressWarnings("empty-statement")
  200. HashIterator() {
  201. index = 0;
  202. currEntry = null;
  203. nextEntry = null;
  204. if (table[index] != null){
  205. nextEntry = table[index];
  206. }
  207. }
  208. @Override
  209. public boolean hasNext() {
  210. return nextEntry != null;
  211. }
  212. @SuppressWarnings("empty-statement")
  213. public Entry<K,V> nextEntry() {
  214. currEntry = nextEntry;
  215. index++;
  216. Entry<K,V> t = table[index];
  217. if (t != null) {
  218. nextEntry = t;
  219. } else {
  220. nextEntry = null;
  221. for (;index < table.length; index++){
  222. if (table[index] != null){
  223. nextEntry = table[index];
  224. }
  225. }
  226. }
  227. return currEntry;
  228. }
  229. }
  230. /*-----------------------------------------------------------*/
  231. class Entry<K,V> implements Map.Entry<K,V>{
  232. final K key;
  233. V value;
  234. Entry(K k, V v) {
  235. value = v;
  236. key = k;
  237. }
  238. @Override
  239. public final K getKey() {
  240. return key;
  241. }
  242. @Override
  243. public final V getValue() {
  244. return value;
  245. }
  246. @Override
  247. public V setValue(V v) {
  248. V val = value;
  249. value = v;
  250. return val;
  251. }
  252. @Override
  253. public String toString() {
  254. return getKey() + "=" + getValue();
  255. }
  256. }
  257. }
  258.  
  259. /*----------------------- Prueba en Consola --------------------------------*/
  260. package hashmapsimple;
  261. public class Cuerpo
  262. {
  263. public static void main(String[] args) {
  264. MyMap<Integer,String>col= new MyMap();
  265. col.put(1, "Deborah");
  266. col.put(2, "Tommy");
  267. col.put(3, "Franco");
  268. col.put(4, "Manuela");
  269. col.put(null,"pepe");
  270. java.util.HashMap<Integer, String> m = new java.util.HashMap();
  271. m.put(5, "Miguel");
  272. m.put(6, "Denisse");
  273. col.putAll(m);
  274. System.out.println(" ");
  275. System.out.println("con containsKey: " + col.containsKey(1));
  276. System.out.println("con containsKey: " + col.containsKey(7));
  277. System.out.println(" ");
  278. System.out.println("con get: " + col.get(1));
  279. System.out.println("con get: " + col.get(7));
  280. System.out.println(" ");
  281. System.out.println("con containsValue: " + col.containsValue("Franco"));
  282. System.out.println("con containsValue: " + col.containsValue("Rodrigo"));
  283. System.out.println("con containsValue: " + col.containsValue(null));
  284. //col.remove(2);
  285. //col.remove(7);
  286. //col.clear();
  287. System.out.println(" ");
  288. System.out.println("tamaño -> " + col.size());
  289. System.out.println(" ");
  290. System.out.println(" --valores-- ");
  291. col.values().stream().forEach((s) -> {
  292. System.out.println(s);
  293. });
  294. System.out.println(" ");
  295. System.out.println(" --claves-- ");
  296. col.keySet().stream().forEach((s) -> {
  297. System.out.println(s);
  298. });
  299. System.out.println(" ");
  300. System.out.println(" --entradas-- ");
  301. col.entrySet().stream().forEach((e)->{
  302. System.out.println("clave -> "+ e.getKey() +" valor -> "+e.getValue());
  303. });
  304. }
  305. }
Advertisement
Add Comment
Please, Sign In to add comment