abdukodir

Untitled

Nov 15th, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.76 KB | None | 0 0
  1. package ru.compscicenter.java2015.collections;
  2.  
  3. import java.util.AbstractCollection;
  4. import java.util.Collection;
  5. import java.util.ConcurrentModificationException;
  6. import java.util.HashMap;
  7. import java.util.Iterator;
  8. import java.util.Map;
  9.  
  10. /**
  11. * Created by qurbonzoda on 07.11.15.
  12. */
  13. public class SimpleMultiSet<E> extends AbstractCollection<E> implements MultiSet<E> {
  14. private Map<E, Integer> elements;
  15. private int size;
  16. public SimpleMultiSet() {
  17. elements = new HashMap<>();
  18. }
  19. public SimpleMultiSet(Collection<? extends E> collection) {
  20. elements = new HashMap<>();
  21. for (E e : collection) {
  22. add(e);
  23. }
  24. }
  25. @Override
  26. public int size() {
  27. return size;
  28. }
  29. @Override
  30. public Iterator<E> iterator() {
  31. return new SimpleMultiSetItetator();
  32. }
  33. @Override
  34. public boolean add(E e) {
  35. add(e, 1);
  36. return true;
  37. }
  38. @Override
  39. public int add(E e, int occurrences) {
  40. if (occurrences < 0) {
  41. throw new IllegalArgumentException();
  42. }
  43. if (elements.containsKey(e)) {
  44. elements.put(e, elements.get(e) + occurrences);
  45. } else {
  46. elements.put(e, occurrences);
  47. }
  48. size += occurrences;
  49. return count(e) - occurrences;
  50. }
  51. @Override
  52. public int remove(Object o, int occurences) {
  53. if (occurences < 0) {
  54. throw new IllegalArgumentException();
  55. }
  56. int cnt = count(o);
  57. if (elements.containsKey(o)) {
  58. if (occurences >= cnt) {
  59. size -= cnt;
  60. elements.remove(o);
  61. } else {
  62. size -= occurences;
  63. elements.put((E) o, cnt - occurences);
  64. }
  65. }
  66. return cnt;
  67. }
  68. @Override
  69. public boolean remove(Object o) {
  70. return 0 < remove(o, 1);
  71. }
  72. @Override
  73. public int count(Object o) {
  74. if (elements.containsKey(o)) {
  75. return elements.get(o);
  76. }
  77. return 0;
  78. }
  79. @Override
  80. public boolean contains(Object o) {
  81. return elements.containsKey(o);
  82. }
  83. @Override
  84. public boolean removeAll(Collection<?> c) {
  85. boolean anyRemoved = false;
  86. for (Object o : c) {
  87. anyRemoved = remove(o, Integer.MAX_VALUE) > 0;
  88. }
  89. return anyRemoved;
  90. }
  91. @Override
  92. public boolean retainAll(Collection<?> c) {
  93. boolean anyRemoved = false;
  94. Iterator<Map.Entry<E, Integer>> iter = elements.entrySet().iterator();
  95. while (iter.hasNext()) {
  96. Map.Entry<E, Integer> entry = iter.next();
  97. if (!c.contains(entry.getKey())) {
  98. size -= entry.getValue();
  99. anyRemoved = true;
  100. iter.remove();
  101. }
  102. }
  103. return anyRemoved;
  104. }
  105. @Override
  106. public void clear() {
  107. size = 0;
  108. elements.clear();
  109. }
  110. @Override
  111. public boolean equals(Object o) {
  112. if (o != null && o instanceof SimpleMultiSet) {
  113. SimpleMultiSet temp = (SimpleMultiSet) o;
  114. if (temp.size() != size()) {
  115. return false;
  116. }
  117. for (Map.Entry<E, Integer> entry : elements.entrySet()) {
  118. if (temp.count(entry.getKey()) != entry.getValue()) {
  119. return false;
  120. }
  121. }
  122. return true;
  123. }
  124. return false;
  125. }
  126.  
  127. class SimpleMultiSetItetator implements Iterator<E> {
  128. private final Iterator<Map.Entry<E, Integer>> entryIterator;
  129. private int occurenceLeft;
  130. private boolean canRemove;
  131. private Map.Entry<E, Integer> currentEntry;
  132. SimpleMultiSetItetator() {
  133. entryIterator = elements.entrySet().iterator();
  134. occurenceLeft = 0;
  135. }
  136. @Override
  137. public boolean hasNext() {
  138. return occurenceLeft > 0 || entryIterator.hasNext();
  139. }
  140. @Override
  141. public E next() {
  142. if (occurenceLeft == 0) {
  143. currentEntry = entryIterator.next();
  144. occurenceLeft = currentEntry.getValue();
  145. }
  146. occurenceLeft--;
  147. canRemove = true;
  148. return currentEntry.getKey();
  149. }
  150. @Override
  151. public void remove() {
  152. if (!canRemove) {
  153. throw new ConcurrentModificationException();
  154. }
  155. if (currentEntry.getValue() == 1) {
  156. entryIterator.remove();
  157. size--;
  158. } else {
  159. SimpleMultiSet.this.remove(currentEntry.getKey());
  160. }
  161. canRemove = false;
  162. }
  163. }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment