/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.support;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
/**
* A set of strings each with a counter associated with each.
* @author toad
*/
public class StringCounter {
private final HashMap<String, Item> map;
private static class Item {
public Item(String string2) {
this.string = string2;
}
final String string;
int counter;
}
public StringCounter() {
map = new HashMap<String, Item>();
}
public synchronized void inc(String string) {
Item item = map.get(string);
if(item == null) {
item = new Item(string);
item.counter = 1;
map.put(string, item);
} else
item.counter++;
}
public int get(String string) {
Item item = map.get(string);
if(item == null) return 0;
return item.counter;
}
private synchronized Item[] items() {
return map.values().toArray(new Item[map.size()]);
}
private synchronized Item[] sortedItems(final boolean ascending) {
Item[] items = items();
Arrays.sort(items, new Comparator<Item>() {
@Override
public int compare(Item it0, Item it1) {
int ret;
if(it0.counter > it1.counter) ret = 1;
else if(it0.counter < it1.counter) ret = -1;
else ret = it0.string.compareTo(it1.string);
if(!ascending) ret = -ret;
return ret;
}
});
return items;
}
public String toLongString() {
Item[] items = sortedItems(false);
if (items.length == 0)
return "";
StringBuilder sb = new StringBuilder();
for(Item it: items) {
sb.append(it.string);
sb.append('\t');
sb.append(it.counter);
sb.append('\n');
}
// assert(sb.length() > 0); -- always true as (items.length != 0)
// remove last '\n'
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
public int toTableRows(HTMLNode table) {
Item[] items = sortedItems(false);
for(Item it: items) {
HTMLNode row = table.addChild("tr");
row.addChild("td", Integer.toString(it.counter)+"\u00a0");
row.addChild("td", it.string);
}
return items.length;
}
}