001 /*--------------------------------------------------------------------------+
002 $Id: CounterSet.java 26268 2010-02-18 10:44:30Z juergens $
003 | |
004 | Copyright 2005-2010 Technische Universitaet Muenchen |
005 | |
006 | Licensed under the Apache License, Version 2.0 (the "License"); |
007 | you may not use this file except in compliance with the License. |
008 | You may obtain a copy of the License at |
009 | |
010 | http://www.apache.org/licenses/LICENSE-2.0 |
011 | |
012 | Unless required by applicable law or agreed to in writing, software |
013 | distributed under the License is distributed on an "AS IS" BASIS, |
014 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
015 | See the License for the specific language governing permissions and |
016 | limitations under the License. |
017 +--------------------------------------------------------------------------*/
018 package edu.tum.cs.commons.collections;
019
020 import java.util.LinkedHashMap;
021 import java.util.Map;
022
023 /**
024 * This class manages a set of counters (i.e. is a mapping from some key objects
025 * to integers). As the implementation is based on hash maps, key objects must
026 * provide suitable hash keys.
027 *
028 *
029 * @author Florian Deissenboeck
030 * @author $Author: juergens $
031 * @version $Rev: 26268 $
032 * @levd.rating GREEN Hash: FE6470D850FAD6E9A77E4059CD0692C5
033 */
034 public class CounterSet<E> {
035
036 /** The underlying map. */
037 protected final Map<E, Integer> map = new LinkedHashMap<E, Integer>();
038
039 /** Stores total value. */
040 protected int total = 0;
041
042 /**
043 * Add the given increment to an element. If the element was not present
044 * before, it is interpreted as if it was present with value 0.
045 *
046 * @param key
047 * the key of the counter to increment.
048 * @param increment
049 * the increment.
050 */
051 public void inc(E key, int increment) {
052 Integer value = map.get(key);
053 int newValue;
054 if (value == null) {
055 newValue = increment;
056 } else {
057 newValue = value + increment;
058 }
059 map.put(key, newValue);
060
061 // update total sum
062 total += increment;
063 }
064
065 /**
066 * Same as <code>inc(key, 1)</code>.
067 *
068 * @see #inc(Object, int)
069 */
070 public void inc(E key) {
071 inc(key, 1);
072 }
073
074 /**
075 * Checks if an element is stored in the array.
076 */
077 public boolean contains(E key) {
078 return map.containsKey(key);
079 }
080
081 /**
082 * Get the value for an element. If the the element is not stored in the
083 * counter <code>0</code> is returned.
084 */
085 public int getValue(E key) {
086 Integer value = map.get(key);
087 if (value == null) {
088 return 0;
089 }
090 return value;
091 }
092
093 /**
094 * Returns the set of all elements used a keys for counters.
095 */
096 public UnmodifiableSet<E> getKeys() {
097 return CollectionUtils.asUnmodifiable(map.keySet());
098 }
099
100 /**
101 * Get total sum of all elements.
102 */
103 public int getTotal() {
104 return total;
105 }
106
107 }