0

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

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

lookupDistance(dest)

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

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

我有一个框架代码,它有一个名为:

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

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

4

2 回答 2

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

这样,您可以计算每个dest.

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

    列表> 列表 = 新的 ArrayList<>(); list.addAll(destinations.entrySet()); // 现在你有一个“条目”列表,每个条目都从 dest 映射到其各自的计数器 // 现在必须对列表进行排序 Collections.sort(list, comparer);

我们在此调用中使用的比较器仍然需要编写。它必须接受两个参数,它们是列表的元素,并根据它们的计数器值比较它们。例程将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();
    }
}

好的,所以我们现在有一个排序ListEntrys,您可以从中选择前 5 个左右。想想就差不多了。所有这些看起来都比应有的复杂,所以我对其他解决方案感到好奇。

于 2013-06-26T21:57:21.257 回答
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});
}
于 2013-06-26T21:33:42.090 回答