我正在构建一些方法,这些方法应该创建输入字符串的缓存,将它们加载到列表中,然后确定该列表中每个字符串的出现次数,按照最常见的顺序对它们进行排序元件。
字符串或元素本身来自JUnit测试。它正在调用一个名为
的方法lookupDistance(dest)
其中“dest”是一个String(目的地机场代码),而lookupDistance返回两个机场代码之间的距离....
有背景。问题是我想将所有“dest”字符串加载到缓存中。最好的方法是什么?
我的骨架代码有一个叫做的方法:
public List<String> mostCommonDestinations()
如何以透明的方式将“dest”字符串添加到List中? JUnit测试用例只调用lookupDistance(dest),那么如何在这个方法中将这些“dest”字符串重定向到List呢?
我如何量化每个元素的出现次数,并说,排名前三或者四?
答案 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)
拥有Map<String, Integer> destinations = new HashMap<>();
在lookupDistance(dest)
中,执行以下操作(未经测试的伪代码):
整数计数= destinations.get(dest); if(count == null){ destinations.put(dest,Integer.valueOf(1)); } else { count = Integer.valueOf(count.intValue()+ 1); }
这样,您可以计算每个dest
的出现次数。
浏览地图并找到最高计数。这有点棘手。一种方法可能是:
列表&gt; list = new ArrayList&lt;&gt;(); list.addAll(destinations.entrySet()); //现在你有一个“条目”列表,每个条目都从dest映射到它各自的计数器 //现在必须对列表进行排序 Collections.sort(列表,比较器);
我们在此调用中使用的比较器仍有待编写。它必须采用两个参数,它们是列表的元素,并根据它们的计数器值进行比较。 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名左右。认为这就是它。所有这些看起来都比应有的复杂,所以我很擅长其他解决方案。