Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.util.function.Function;
- /**
- *
- * The class purpose is to optimize memory usage checking for duplicates in a
- * list or stream of strings
- *
- */
- public class StringUniquenessChecker {
- private Map<Integer, Map<String, Integer>> stringUsage = new HashMap<>();
- private Set<Integer> hashCodes = new HashSet<>();
- public void doAction1(List<String> list, Function<String,Void> func) {
- for (int i = 0; i< list.size(); i++) {
- String string = list.get(i);
- int hashCode = string.hashCode();
- if (!hashCodes.contains(hashCode)) {
- stringUsage.put(hashCode, null);
- func.apply(string);
- } else {
- if (!stringUsage.containsKey(hashCode)) {
- Map<String, Integer> stringCountMap = new HashMap<>();
- stringCountMap.put(string, 0);
- stringUsage.putIfAbsent(hashCode, stringCountMap);
- func.apply(string);
- } else {
- Map<String, Integer> stringCountMap = stringUsage.get(hashCode);
- if (stringCountMap != null) {
- Integer count = stringCountMap.get(string);
- if (count == null) {
- stringCountMap.put(string, 1);
- func.apply(string);
- } else {
- stringCountMap.put(string, count + 1);
- func.apply(string);
- }
- stringUsage.put(hashCode, stringCountMap);
- } else {
- stringCountMap = new HashMap<>();
- stringCountMap.put(string, 1);
- stringUsage.put(hashCode, stringCountMap);
- }
- }
- }
- hashCodes.add(hashCode);
- }
- }
- public void doAction(Function<String,Void> func) {
- for (int i = 0; i< 1000; i++) {
- String string = StringProvider.provide();
- int hashCode = string.hashCode();
- if (!hashCodes.contains(hashCode)) {
- stringUsage.put(hashCode, null);
- } else {
- if (!stringUsage.containsKey(hashCode)) {
- Map<String, Integer> stringCountMap = new HashMap<>();
- stringCountMap.put(string, 0);
- stringUsage.putIfAbsent(hashCode, stringCountMap);
- } else {
- Map<String, Integer> stringCountMap = stringUsage.get(hashCode);
- if (stringCountMap != null) {
- Integer count = stringCountMap.get(string);
- if (count == null) {
- stringCountMap.put(string, 1);
- } else {
- stringCountMap.put(string, count + 1);
- }
- stringUsage.put(hashCode, stringCountMap);
- } else {
- stringCountMap = new HashMap<>();
- stringCountMap.put(string, 1);
- stringUsage.put(hashCode, stringCountMap);
- }
- }
- }
- hashCodes.add(hashCode);
- }
- for (int i = 0; i< 1000; i++) {
- String string = StringProvider.provide();
- int hashCode = string.hashCode();
- Map<String, Integer> stringCountMap = stringUsage.get(hashCode);
- if (stringCountMap == null) {
- func.apply(string);
- } else {
- Integer countOfString = stringCountMap.get(string);
- if (countOfString == null || countOfString == 1) {
- func.apply(string);
- }
- if (countOfString != null) {
- stringCountMap.put(string, countOfString - 1);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement