11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Multisets.setCountImpl;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Objects;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractCollection;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * This class provides a skeletal implementation of the {@link Multiset}
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * interface. A new multiset implementation can be created easily by extending
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * this class and implementing the {@link Multiset#entrySet()} method, plus
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * optionally overriding {@link #add(Object, int)} and
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #remove(Object, int)} to enable modifications to the multiset.
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The {@link #count} and {@link #size} implementations all iterate across
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the set returned by {@link Multiset#entrySet()}, as do many methods acting on
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the set returned by {@link #elementSet()}. Override those methods for better
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * performance.
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertabstract class AbstractMultiset<E> extends AbstractCollection<E>
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    implements Multiset<E> {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Query Operations
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public int size() {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Multisets.sizeImpl(this);
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean isEmpty() {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return entrySet().isEmpty();
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean contains(@Nullable Object element) {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return count(element) > 0;
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public Iterator<E> iterator() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Multisets.iteratorImpl(this);
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int count(Object element) {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<E> entry : entrySet()) {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (Objects.equal(entry.getElement(), element)) {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return entry.getCount();
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return 0;
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Modification Operations
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean add(@Nullable E element) {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    add(element, 1);
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return true;
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int add(E element, int occurrences) {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new UnsupportedOperationException();
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean remove(Object element) {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return remove(element, 1) > 0;
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int remove(Object element, int occurrences) {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    throw new UnsupportedOperationException();
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int setCount(E element, int count) {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return setCountImpl(this, element, count);
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean setCount(E element, int oldCount, int newCount) {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return setCountImpl(this, element, oldCount, newCount);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Bulk Operations
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@inheritDoc}
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This implementation is highly efficient when {@code elementsToAdd}
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * is itself a {@link Multiset}.
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean addAll(Collection<? extends E> elementsToAdd) {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Multisets.addAllImpl(this, elementsToAdd);
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean removeAll(Collection<?> elementsToRemove) {
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Multisets.removeAllImpl(this, elementsToRemove);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean retainAll(Collection<?> elementsToRetain) {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Multisets.retainAllImpl(this, elementsToRetain);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void clear() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterators.clear(entryIterator());
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Views
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private transient Set<E> elementSet;
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Set<E> elementSet() {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<E> result = elementSet;
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (result == null) {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      elementSet = result = createElementSet();
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return result;
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Creates a new instance of this multiset's element set, which will be
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returned by {@link #elementSet()}.
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  Set<E> createElementSet() {
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new ElementSet();
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  class ElementSet extends Multisets.ElementSet<E> {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<E> multiset() {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return AbstractMultiset.this;
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  abstract Iterator<Entry<E>> entryIterator();
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  abstract int distinctElements();
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private transient Set<Entry<E>> entrySet;
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public Set<Entry<E>> entrySet() {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Entry<E>> result = entrySet;
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (result == null) ? entrySet = createEntrySet() : result;
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  class EntrySet extends Multisets.EntrySet<E> {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override Multiset<E> multiset() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return AbstractMultiset.this;
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Iterator<Entry<E>> iterator() {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return entryIterator();
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int size() {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return distinctElements();
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  Set<Entry<E>> createEntrySet() {
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new EntrySet();
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Object methods
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@inheritDoc}
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This implementation returns {@code true} if {@code object} is a multiset
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * of the same size and if, for each element, the two multisets have the same
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * count.
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public boolean equals(@Nullable Object object) {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Multisets.equalsImpl(this, object);
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@inheritDoc}
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This implementation returns the hash code of {@link
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Multiset#entrySet()}.
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public int hashCode() {
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return entrySet().hashCode();
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@inheritDoc}
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>This implementation returns the result of invoking {@code toString} on
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Multiset#entrySet()}.
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public String toString() {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return entrySet().toString();
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
222