- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了一个类似 LFU 的网络缓存替换算法,其工作原理如下:在每个请求中,我分配一个由 1/(p^reqIndex) 给出的权重,其中 p 是一个权重因子,reqIndex 是请求的索引(第一个请求,第二个请求等)。例如,当 p = 0.5 时,第一个请求的权重为 1,第二个请求的权重为 2,第三个请求的权重为 4,等等。然后为了计算每个请求项的分数(我称之为加权频率,weightFreq),我简单地求和相应的权重。所请求的项目仅通过数字 ID(整数)进行区分,我将其称为请求 ID (reqID)。例如,如果第一个请求针对 ID 为 7 的项目,第二个请求针对 ID 为 3 的项目,第三个请求针对 ID 为 7 的项目,则 ID 为 7 的项目的得分应为 1 + 4 = 5 (第一个请求的权重 + 第三个请求的权重)而 ID 为 3 的项目应该有一个分数 2(第二个请求的权重)。
我使用 ListMultimap(通过 Google Guava 库)作为权重,因为我应该能够为单个键 (reqID) 设置多个值(权重):
/** ListMultimap of reqID (K) and weights (V) */
private ListMultimap<Integer, Double> weights;
我为分数使用了一个简单的 map :
/** Map of reqID (K) and weightFreq (V) */
private Map<Integer, Double> weightFreqs;
这是我计算并返回所请求项目分数的 getter 方法:
/**
* Getter for weighted frequency of the requested item
* @param request The requested item
* @param reqIndex The index of the request
* @return this.weightFreqs.get(request.reqID) weightFreq of the req. item
*/
public double getWeightFreq(Request request, int reqIndex) {
// initialize weightFreq
initWeightFreqs(request);
// calculate weight
weight = Math.pow(1/p, reqIndex);
// put request along with its weight to the weights ListMultimap
weights.put(request.reqID, weight);
// scan keys of weights list-multimap
for(Integer key : this.weights.keySet()) {
// if the key is the requested item
if (key == request.reqID) {
// list of all weights for this key (reqID)
List<Double> tempWeights = weights.get(key);
// test
logger.info("List of weights for request with ID: " +
request.reqID + " is: " + tempWeights);
// sum of those weights
int sum = 0;
// scan the list
for(int i = 0; i < tempWeights.size(); i++) {
// sum the weights
sum += tempWeights.get(i);
}
// assign the sum to the weightFreq value
weightFreq = sum;
// put reqID along with its weightFreq into weightFreqs map
weightFreqs.put(request.reqID, weightFreq);
}
}
// return weightFreq of requested item
return this.weightFreqs.get(request.reqID);
}
如您所见,我包含了一个测试打印(每个 reqID 的权重列表)以检查代码。现在看看当我运行代码时会发生什么。同样的例子,第一个请求是针对 reqID 7,第二个请求是针对 reqID 3。在第一个请求之后,我得到:
ReqID:7 权重:[1.0]
没关系。但是在第二次请求之后我得到:
ReqID:7 权重:[1.0]ReqID:3 权重:[1.0, 2.0]
这是错误的!正确的应该是:
ReqID:7 权重:[1.0]ReqID:3 权重:[2.0]
因此,我得到 reqID 3 的分数 (weightFreq) 等于 3 (1+2) 而不是 2,这是正确的。
请注意,我只在过去 7 个月左右才开始学习编程,这是我第一次不得不使用多重映射(因为我需要为单个键分配多个值)。我从这里得到了这样做的想法和相关信息:
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html
它说明了多重映射的几种不同实现(ListMultimap、SetMultimap 等),用于替代使用集合映射或 asMap 通过 Google Guava 等执行相同操作。
我不确定我是否对多图理解有误,或者我对之前的 getter 方法的逻辑有误。任何指导将不胜感激。
最佳答案
不知道这里发生了什么,但要发表评论的内容太多了。你肯定可以修复它,只是先简化它。测试
key == request.reqID
很可能是错误的,因为您处理的是 Integer
而不是 int
。在这种情况下,永远不要依赖自动(取消)装箱并使用 equals
或 intValue
。
您的代码过于复杂。您想要处理 request.reqID
的条目,因此获取它们:
List<Double> tempWeights = weights.get(request.reqID);
删除外层循环和 if
。
进一步简化,例如,使用 foreach 循环
for (double d : tempWeights) sum += d;
当所有不需要的东西都消失后,您可能会立即发现问题。
关于Java - Google Guava Multimap 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20512718/
这个问题不太可能帮助任何 future 的访客;它只与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
我有: data class Edge(val spec: String, val weight: Int) private val graph: SortedSetMultimap = TreeMu
鉴于使用以下代码创建的 Guava 缓存,如果未设置,是否有最大缓存大小? LoadingCache loadingCache = CacheBuilder.newBuilder().build(ne
我需要向 Guava Multimap 添加一个键,其中一个空集合作为值。我该如何做到这一点? 我试过这个: map.put( "my key", null ); 但是调用 get() 会返回一个包含
我刚刚遇到这样的代码: ExecutorService executorService = MoreExecutors.sameThreadExecutor(); for (int i = 0; i
我使用的是来自 Google Collections 的 com.google.common.collect.PrimitiveArrays,但是我在 Guava 中找不到它,是否已重命名?我在哪里可
当前,我正在使用以下代码在映射中创建过滤器以匹配并提供过滤后的结果集列表。 final Map filteredMap = Maps.filterKeys(mymap, Predicates.cont
当我在 app/build.gradle 中使用 implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
Google Guava Cache 文档指出: Refreshing is not quite the same as eviction. As specified in LoadingCache.
Guava 的 ImmutableList.Builder 的线程安全保证是什么? javadocs 没有说。 最佳答案 虽然 Guava Immutable 类是线程安全的,但它们的构建器不是。对于
目前我在我的应用程序中使用 guava EventBus 方法。监听器尝试做一些工作,如果失败,事件应该回到总线并重新发送。 我的问题是:如果我的应用程序出现故障(执行关闭)怎么办?它会在总线上发送剩
是否可以使用现有的 java 静态方法作为开箱即用的扩展? 让我们考虑 com.google.common.collect.Iterables.transform。现在,因为我不知道如何处理这个问题,
我想创建一个由 Guava 函数支持的只读 map 。我有一个提供值的函数,给定一个键。 Function f = new Function() { public Object apply(f
我最近将 Google Guava 作为库添加到我的 Eclipse 项目中(我从 http://code.google.com/p/guava-libraries/ 下载了“guava-16.0.j
我们最近从 Drools 5 升级到 Drools 6 并遇到了令人不安的冲突问题。 我们有kie-ci导入到项目中。 kie-ci引进 sisu-guava . sisu-guava改变了谷歌 Gu
尝试取消注册时,我在我的一个类(class)中收到以下错误。 java.lang.IllegalArgumentException: missing event handler for an anno
我的项目传递依赖于 Google Guava lib。突然(使用新版本的 Guava ?)应用程序在启动时崩溃java.lang.NoSuchMethodError: 'java.util.strea
我喜欢 Google Guava 并且经常使用它,但是我总是发现我在写一种方法。 public static T tryFind(Iterable iterable, Predicate pred
我使用的是普通的旧 Java 1.6,并且对这两个库都感兴趣。 阅读文档后,我不确定是否存在差异(如果有的话)。任何人都可以解释一下,或者指出一些相关信息吗?提前致谢! 最佳答案 RxJava 比 L
我用的是 Guava 17.0 private static final ConcurrentMap imageMap = new MapMaker().softValues().ma
我是一名优秀的程序员,十分优秀!