I had a problem where I have to keep a track of the frequency of occurrence of a given string in a record (row). I was thinking of doing this using a Map (Probably the best candidate here) where the key is the string and value is the frequency of occurrence.
But there was a catch here, what should we do on the first occurrence of the string as it won't be present in the Map. Below is the solution I came up with:
Above implementation which uses Java 8 Stream API does the trick as if we are executing a aggregate function COUNT(*) with GROUP BY. Cool !!
But there was a catch here, what should we do on the first occurrence of the string as it won't be present in the Map. Below is the solution I came up with:
import java.util.HashMap;
public class MyHashMap {
private HashMap<String, Integer> myHashMap;
public MyHashMap(final HashMap<String, Integer> myHashMap) {
this.myHashMap = myHashMap;
}
public void put(String key) {
Integer integer = myHashMap.get(key);
if (integer == null) {
myHashMap.put(key, new Integer(1));
} else {
myHashMap.put(key, ++integer);
}
}
@Override
public String toString() {
return "MyHashMap [myHashMap=" + myHashMap + "]";
}
public static void main(String[] args) {
MyHashMap m = new MyHashMap(new HashMap<>());
m.put("Steve");
m.put("Steve");
m.put("Simon");
System.out.println(m);
}
}
Output:
MyHashMap [myHashMap={Simon=1, Steve=2}]
public class MyHashMap {
private HashMap<String, Integer> myHashMap;
public MyHashMap(final HashMap<String, Integer> myHashMap) {
this.myHashMap = myHashMap;
}
public void put(String key) {
Integer integer = myHashMap.get(key);
if (integer == null) {
myHashMap.put(key, new Integer(1));
} else {
myHashMap.put(key, ++integer);
}
}
@Override
public String toString() {
return "MyHashMap [myHashMap=" + myHashMap + "]";
}
public static void main(String[] args) {
MyHashMap m = new MyHashMap(new HashMap<>());
m.put("Steve");
m.put("Steve");
m.put("Simon");
System.out.println(m);
}
}
Output:
MyHashMap [myHashMap={Simon=1, Steve=2}]
Above implementation works fine however you can see we had to do first occurrence handling in put method from our side which I wanted to avoid so I was looking at some other solution. No problem Java 8 Stream API is here and does this thing very smoothly in one liner.
Following is the Java 8 code snippet :
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamsDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Steve");
list.add("Steve");
list.add("Frank");
list.add("Tom");
list.add("Steve");
Stream<String> stream = list.stream();
Map<String, Long> collect = stream.collect(Collectors. groupingBy(e -> e, Collectors.counting()));
System.out.println(collect);
}
}
Output:
{Frank=1, Tom=1, Steve=3}
Above implementation which uses Java 8 Stream API does the trick as if we are executing a aggregate function COUNT(*) with GROUP BY. Cool !!