【问题标题】:How can I simulate cache using HashMap如何使用 HashMap 模拟缓存
【发布时间】:2019-02-20 01:48:14
【问题描述】:

我想计算给定字符串中的唯一字符并使用集合缓存它们,这样如果字符串已经存在,它就不会再次计算。为此,我使用了HashMap,我将字符串作为键并将其计为值。我已经编写了以下代码,但它不会在映射中添加那些键值对。如何解决这个问题?

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");
    }
}

【问题讨论】:

  • map.get(..)
  • 全局声明map
  • 使用 Map - 或 hasMap - 不仅仅是模拟缓存。它一个缓存。

标签: java arraylist collections hashmap


【解决方案1】:

maintainCache 每次调用时都会创建一个新的局部变量 map。如果您希望该映射在调用之间保留其值,则应将其从方法中提取并保留为成员。

【讨论】:

  • 还是不行,有其他错误请指教
【解决方案2】:

问题是每次调用maintainCache时都会重新创建HashMap。请将地图作为 UniqueCharacters 类的属性,而不是方法维护缓存下的局部变量

【讨论】:

    【解决方案3】:
    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;
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2021-04-29
      • 2020-09-18
      • 2016-02-20
      相关资源
      最近更新 更多