package jcircus.newfrontendmethod;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Vector;
public class FrontEndCounter {
HashMap <String, Integer> counter;
public FrontEndCounter () {
counter = new LinkedHashMap <String, Integer> ();
}
public FrontEndCounter (FrontEndCounter fec) {
this.counter = new LinkedHashMap <String, Integer> (fec.getMap());
}
public void put (String channel) {
Integer xis;
if (this.counter.containsKey (channel)) {
/*xis = this.counter.get(channel);
this.counter.remove(channel);
this.counter.put(channel, xis + 1);*/
}
else {
this.counter.put(channel, 1);
}
}
public void put (String channel, Integer x) {
if (this.counter.containsKey (channel)) {
this.counter.remove(channel);
}
this.counter.put(channel, x);
}
public static FrontEndCounter createOneCounter (Object [] keys) {
FrontEndCounter fec = new FrontEndCounter ();
for (int i = 0; i < keys.length; i++) {
fec.put((String)keys [i], 1);
}
return fec;
}
public void putPlus (String channel, Integer x) {
if (this.counter.containsKey (channel)) {
this.counter.put(channel, this.counter.get(channel) + x);
}
this.counter.put(channel, x);
}
public Integer get (String channel) {
if (this.counter.containsKey (channel))
return this.counter.get(channel);
else return new Integer (0);
}
public HashMap <String, Integer> getMap () {
return this.counter;
}
public static FrontEndCounter sumFrontEnds (FrontEndCounter fec1, FrontEndCounter fec2, Vector <String> channelSet) {
Object [] keys1 = fec1.getMap().keySet().toArray();
Object [] keys2 = fec2.getMap().keySet().toArray();
Object [] keysall = withoutDuplicates (keys1, keys2);
FrontEndCounter fecall = new FrontEndCounter ();
for (int i = 0; i < keysall.length; i++) {
Integer x1 = fec1.get((String) keysall [i]);
Integer x2 = fec2.get((String) keysall [i]);
fecall.put((String)keysall [i], x1 + x2);
}
return fecall;
}
private static Object [] withoutDuplicates (Object [] keys1, Object [] keys2) {
Vector <Object> keysall = new Vector <Object> (); //new Object [keys1.length + keys2.length];
for (int i = 0; i < keys1.length; i++) {
keysall.addElement(keys1 [i]);
}
for (int i = 0; i < keys2.length; i++) {
if (!keysall.contains (keys2 [i]))
keysall.addElement(keys2 [i]);
}
return keysall.toArray();
}
public static FrontEndCounter mergeFrontEndCounters (FrontEndCounter fem1, FrontEndCounter fem2, Vector <String> channelSet) {
FrontEndCounter fem = new FrontEndCounter ();
Object [] keys1 = fem1.getMap().keySet().toArray();
Object [] keys2 = fem2.getMap().keySet().toArray();
Object [] keysall = withoutDuplicates (keys1, keys2);
for (int i = 0; i < keysall.length; i++) {
Integer x1 = fem1.get((String) keysall [i]);
Integer x2 = fem2.get((String) keysall [i]);
if (channelSet.contains((String)keysall [i]))
fem.put((String)keysall [i], x1 + x2);
else
fem.put((String)keysall [i], (x1 > x2)? x1 : x2);
}
return fem;
}
public static FrontEndCounter mergeFrontEndCounters (FrontEndCounter fem1, FrontEndCounter fem2) {
return FrontEndCounter.mergeFrontEndCounters(fem1, fem2, new Vector <String> ());
}
public static void main (String args []) { //TESTE DE mergeParallel e mergeNormal
FrontEndCounter fem1 = new FrontEndCounter ();
FrontEndCounter fem2 = new FrontEndCounter ();
FrontEndCounter femparallel = new FrontEndCounter ();
FrontEndCounter femnormal = new FrontEndCounter ();
fem1.put("a");
fem1.put("a");
fem1.put("a");
fem1.put("b");
fem1.put("b");
fem2.put("a");
fem2.put("a");
fem2.put("b");
Vector <String> channelSet = new Vector <String> ();
channelSet.add("a");
channelSet.add("b");
femnormal = mergeFrontEndCounters (fem1, fem2);
femparallel = mergeFrontEndCounters (fem1, fem2, channelSet);
System.out.println ("MergeNormal = \n" + frontEndMapAsString (femnormal)); //Como esperado
System.out.println ("MergeParallel = \n" + frontEndMapAsString (femparallel)); //Como esperado
}
private static String frontEndMapAsString (FrontEndCounter fem) {
String str = "FrontEndMap {\n";
Object [] allkeys = fem.getMap().keySet().toArray();
for (int i = 0; i < allkeys.length; i++) {
str = str + " " + (String) allkeys [i] + " --> " + fem.get((String)allkeys [i]) + "\n";
}
str = str + "}";
return str;
}
public static FrontEndCounter mergeNormal (FrontEndCounter fem1, FrontEndCounter fem2) {
FrontEndCounter fem = new FrontEndCounter ();
Object [] keys1 = fem1.getMap().keySet().toArray();
Object [] keys2 = fem2.getMap().keySet().toArray();
Object [] keysall = withoutDuplicates (keys1, keys2);
for (int i = 0; i < keysall.length; i++) {
Integer x1 = fem1.get((String) keysall [i]);
Integer x2 = fem2.get((String) keysall [i]);
fem.put((String)keysall [i], (x1 > x2)? x1 : x2);
}
return fem;
}
}