()
| 429 | } |
| 430 | |
| 431 | @Override |
| 432 | Iterator<Entry<E>> entryIterator() { |
| 433 | final Iterator<? extends Entry<? extends E>> iterator1 = multiset1.entrySet().iterator(); |
| 434 | final Iterator<? extends Entry<? extends E>> iterator2 = multiset2.entrySet().iterator(); |
| 435 | // TODO(lowasser): consider making the entries live views |
| 436 | return new AbstractIterator<Entry<E>>() { |
| 437 | @Override |
| 438 | protected Entry<E> computeNext() { |
| 439 | if (iterator1.hasNext()) { |
| 440 | Entry<? extends E> entry1 = iterator1.next(); |
| 441 | E element = entry1.getElement(); |
| 442 | int count = Math.max(entry1.getCount(), multiset2.count(element)); |
| 443 | return immutableEntry(element, count); |
| 444 | } |
| 445 | |
| 446 | while (iterator2.hasNext()) { |
| 447 | Entry<? extends E> entry2 = iterator2.next(); |
| 448 | E element = entry2.getElement(); |
| 449 | if (!multiset1.contains(element)) { |
| 450 | return immutableEntry(element, entry2.getCount()); |
| 451 | } |
| 452 | } |
| 453 | return endOfData(); |
| 454 | } |
| 455 | }; |
| 456 | } |
| 457 | |
| 458 | @Override |
| 459 | int distinctElements() { |
no test coverage detected