package de.raphinesse.kit.prog12.collections;

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

public class StringStats {
    private Map<String, Integer> ccCache = new HashMap<>();

    private int getUniqueCharCount(String s) {
        System.out.println("Calculating...");
        return new HashSet<String>(Arrays.asList(s.split(""))).size();
    }

    public int uniqueCharCount(String s) {
        if (!ccCache.containsKey(s)) {
            ccCache.put(s, getUniqueCharCount(s));
        }
        return ccCache.get(s);
    }

    public SortedMap<Character, List<Integer>> charPositions(String s) {
        SortedMap<Character, List<Integer>> map = new TreeMap<>();
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; ++i) {
            if (!map.containsKey(chars[i])) {
                map.put(chars[i], new LinkedList<Integer>());
            }
            map.get(chars[i]).add(i);
        }
        return map;
    }

    public static void main(String []args){
        StringStats ss = new StringStats();
        System.out.println(ss.uniqueCharCount("Hello World"));
        System.out.println(ss.uniqueCharCount("Hello World"));
        System.out.println(ss.charPositions("Hello World"));
    }
}
