将字符串加载到缓存的最佳方法

时间:2013-06-26 21:30:12

标签: java list caching

我正在构建一些方法,这些方法应该创建输入字符串的缓存,将它们加载到列表中,然后确定该列表中每个字符串的出现次数,按照最常见的顺序对它们进行排序元件。

字符串或元素本身来自JUnit测试。它正在调用一个名为

的方法
lookupDistance(dest)

其中“dest”是一个String(目的地机场代码),而lookupDistance返回两个机场代码之间的距离....

有背景。问题是我想将所有“dest”字符串加载到缓存中。最好的方法是什么?

我的骨架代码有一个叫做的方法:

public List<String> mostCommonDestinations()
  1. 如何以透明的方式将“dest”字符串添加到List中? JUnit测试用例只调用lookupDistance(dest),那么如何在这个方法中将这些“dest”字符串重定向到List呢?

  2. 我如何量化每个元素的出现次数,并说,排名前三或者四?

2 个答案:

答案 0 :(得分:0)

您可以在启动时添加已知目标,并在缓存到达时继续添加新字符串。这是一种方式。另一种方法是在请求时缓存字符串,保留它们以备将来请求。在这种情况下,您的lookupDistance也应该缓存字符串。

首先创建一个包含Hashmap的小类。键是您的目标字符串,如果要保留多个信息,则值可以是对象,也可以只是指定使用该字符串的次数的数字。我建议使用数据对象。 请注意,下面的代码只是给你一个想法,更像是伪代码。

class Cache {
private Hashmap<String, CacheObject>;

public void Add(string, CacheObject);
public CacheObject Lookup(string);
public CacheObject Remove(string);
public static Cache getInstance(); //single cache
}

class CacheObject {
public int lookupCount;
public int lastUsed;
}

在您的lookupDistance中,您可以完成

if(Cache.getInstance().Lookup(string) == null) {
Cache.getInstance().Add(string, new CacheObject() { 1, Date.now});
}

答案 1 :(得分:0)

  1. 拥有Map<String, Integer> destinations = new HashMap<>();

  2. lookupDistance(dest)中,执行以下操作(未经测试的伪代码):

    整数计数= destinations.get(dest); if(count == null){      destinations.put(dest,Integer.valueOf(1)); } else {     count = Integer.valueOf(count.intValue()+ 1); }

  3. 这样,您可以计算每个dest的出现次数。

    1. 浏览地图并找到最高计数。这有点棘手。一种方法可能是:

      列表&gt; list = new ArrayList&lt;&gt;(); list.addAll(destinations.entrySet()); //现在你有一个“条目”列表,每个条目都从dest映射到它各自的计数器 //现在必须对列表进行排序 Collections.sort(列表,比较器);

    2. 我们在此调用中使用的比较器仍有待编写。它必须采用两个参数,它们是列表的元素,并根据它们的计数器值进行比较。 sort例程将完成其余的工作。

      Comparator<Map.Entry<String, Integer>> comparator = new Comparator<>() {
          public @Override int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
              return a.getValue().intValue() - b.getValue().intValue();
          }
      }
      

      好的,我们现在已经排序List Entry,你可以从中挑选前5名左右。认为这就是它。所有这些看起来都比应有的复杂,所以我很擅长其他解决方案。