Как я могу имитировать кэш с помощью HashMap - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу вычислить уникальные символы в заданной строке и кэшировать их, используя коллекции, чтобы, если строка уже присутствовала, она не вычислялась снова.Для этого я использовал HashMap, я сделал String в качестве ключа, и он считается значением.Я написал следующий код, но он не добавит эти пары ключ-значение на карту.Как решить эту проблему?

class UniqueCharacters {

    public int uniqueCharacters(String s)
    {
        List<Character> list=new ArrayList<Character>();
        for(int i=0; i<s.length();i++)
        {
            if(!(list.contains(s.charAt(i))))
            {
                list.add(s.charAt(i));
            }
        }
        for(Character c:list)
        {
            System.out.println(c);
        }
        int count=list.size();
        maintainCache(s, count);

        System.out.println(count);
        return count;
    }

    public void maintainCache(String s, int count)
    {
        Map<String,Integer> map=new HashMap<String,Integer>();
        for(Map.Entry<String, Integer> entry: map.entrySet())
        {
            if(entry.getKey().equals(s))
            {
                System.out.println(entry.getKey()+" "+entry.getValue());
                System.out.println("String was already there");
            }
            else
            {
                map.put(s, count);
                System.out.println("String added to the cache");
            }
        }
    }
}

public class UniqueCharactersTest {

    public static void main(String[] args) {
        UniqueCharacters u=new UniqueCharacters();
        u.uniqueCharacters("hello");
    }
}

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Проблема в том, что HashMap создается заново каждый раз, когда вызывается keepCache. Пожалуйста, имейте карту как свойство класса UniqueCharacters вместо локальной переменной в методе keepCache

0 голосов
/ 15 сентября 2018
import java.util.HashMap;
import java.util.Map;

public class StringCacheTest {

    public static void main(String[] args) {
        StringCache cache = new StringCache();

        System.out.println("Unique characters : " + cache.getUniqueCharactersCount("test"));
        System.out.println("Unique characters : " + cache.getUniqueCharactersCount("test2"));
        System.out.println("Unique characters : " + cache.getUniqueCharactersCount("test"));
    }

}

class StringCache {

    private Map<String, Long> cache;

    public StringCache(){
        this.cache = new HashMap<>();
    }

    public Long getUniqueCharactersCount(String string){
        if(string == null){
            throw new RuntimeException("Null string");
        }
        if(cache.containsKey(string)){
            System.out.println("String " + string + " found in cache");
            return cache.get(string);
        } else {
            System.out.println("String " + string + " not found in cache");
            long uniqueCharactersCount = string
                    .chars()
                    .distinct()
                    .count();
            cache.put(string, uniqueCharactersCount);
            return uniqueCharactersCount;
        }
    }

}
0 голосов
/ 15 сентября 2018

maintainCache создает новую локальную переменную map каждый раз, когда ее вызывают. Если вы хотите, чтобы эта карта сохраняла свои значения между вызовами, вы должны извлечь ее из метода и сохранить как член.

...