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