org.glassfish.pfl.basic.contain.MultiSet Maven / Gradle / Ivy
/*
* Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0, which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.glassfish.pfl.basic.contain ;
import java.util.Map ;
import java.util.HashMap ;
/** A simple abstraction of a MultiSet, that is, a "set" that can contain
* more than one copy of the same element. I am implementing only the
* bare minimum that is required for now.
*/
public class MultiSet {
private Map contents = new HashMap() ;
public void add( E element ) {
Integer value = contents.get( element ) ;
if (value == null) {
value = 0 ;
}
value += 1 ;
contents.put( element, value ) ;
}
public void remove( E element ) {
Integer value = contents.get( element ) ;
if (value == null) {
return ;
}
value -= 1 ;
if (value == 0) {
contents.remove( element ) ;
} else {
contents.put( element, value ) ;
}
}
public boolean contains( E element ) {
Integer value = contents.get( element ) ;
if (value == null) {
value = 0 ;
}
return value > 0 ;
}
/** Return the number of unique elements in this MultiSet.
*/
public int size() {
return contents.keySet().size() ;
}
private static void shouldBeTrue( boolean val, String msg ) {
if (!val)
System.out.println( msg ) ;
}
private static void shouldBeFalse( boolean val, String msg ) {
if (val)
System.out.println( msg ) ;
}
public static void main( String[] args ) {
MultiSet mset = new MultiSet() ;
String s1 = "first" ;
String s2 = "second" ;
mset.add( s1 ) ;
shouldBeTrue( mset.contains( s1 ), "mset does not contain s1 (1)" ) ;
mset.add( s2 ) ;
mset.add( s1 ) ;
mset.remove( s1 ) ;
shouldBeTrue( mset.contains( s1 ), "mset does not contain s1 (2)" ) ;
mset.remove( s1 ) ;
shouldBeFalse( mset.contains( s1 ), "mset still contains s1 (3)" ) ;
shouldBeTrue( mset.contains( s2 ), "mset does not contain s2 (4)" ) ;
}
}