Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:缓存计算结果的数据结构?_Java_Caching_Map_Tuples_Computation - Fatal编程技术网

Java:缓存计算结果的数据结构?

Java:缓存计算结果的数据结构?,java,caching,map,tuples,computation,Java,Caching,Map,Tuples,Computation,我有一个昂贵的计算,结果我想缓存。有没有办法用两把钥匙做一张地图?我正在考虑类似于Map的东西 然后我可以检查: if (! cache.contains(thing1, thing2)) { return computeResult(); } else { return cache.getValue(thing1, thing2); } 伪代码。如果你使用的话,它的类有一个makeComputingMap方法,它完全按照你描述的做。作为免费奖励,它也是线程安全的(实现Concurre

我有一个昂贵的计算,结果我想缓存。有没有办法用两把钥匙做一张地图?我正在考虑类似于
Map
的东西

然后我可以检查:

if (! cache.contains(thing1, thing2)) {
  return computeResult();
}
else {
  return cache.getValue(thing1, thing2);
}
伪代码。如果你使用的话,它的类有一个
makeComputingMap
方法,它完全按照你描述的做。作为免费奖励,它也是线程安全的(实现
ConcurrentMap


至于双键的事情,你必须创建一个包含这两个键的类,并实现一个合适的实现
equals
hashCode
,和(如果适用的话)
compareTo
,以你想要的方式进行键比较。

你需要创建一个包含Thing1和Thing2的类,例如:

class Things {
    public final Thing1 thing1;
    public final Thing2 thing2;
    public Things(Thing1 thing1, Thing2 thing2) {
      this.thing1 = thing1; 
      this.thing2 = thing2;
    }
    @Override
    public boolean equals(Object obj) { ... }
    @Override
    public int hashCode() { ... };
 }
然后使用它:

Things key = new Things(thing1, thing2);
if (!cache.contains(key) {
    Integer result = computeResult();
    cache.put(key, result);
    return result;
} else {
    return cache.getValue(key);
}

注意,您必须实现equals和hashcode,以使此代码正常工作。如果您需要此代码是线程安全的,那么请查看ConcurrentHashMap。

听起来您需要备忘录。最新的行李箱头部有一个记忆产品类型
P1
,该产品为一个计算建模,其结果被缓存

您可以这样使用它:

P1<Thing> myThing = new P1<Thing>() {
  public Thing _1() {
    return expensiveComputation();
  }
}.memo();
P1神话=新P1(){
公共事务{
返回expensiveComputation();
}
}.memo();
第一次调用_1()将运行昂贵的计算并将其存储在备忘录中。然后,返回备忘录

对于“两把钥匙”,您需要一个简单的配对类型。Functional Java也以类
P2
的形式提供了这一功能。要记住这样的值,只需使用
P1

您还可以使用
Promise
类代替备忘录。这在库中已经有一段时间了,所以您只需要最新的二进制文件。您可以按如下方式使用:

Promise<Thing> myThing =
  parModule(sequentialStrategy).promise(new P1<Thing>() {
    public Thing _1() {
      return expensiveComputation();
    }
  });
承诺神话=
parModule(顺序策略).promise(新P1(){
公共事务{
返回expensiveComputation();
}
});
要获得结果,只需调用
myThing.claim()
Promise
还提供了将函数映射到结果的方法,即使结果尚未准备好


您需要
导入静态fj.control.parallel.ParModule.ParModule
fj.control.parallel.Strategy.sequentialStrategy
。如果希望计算在自己的线程中运行,请将
顺序策略
替换为
策略
类提供的其他策略之一。

。。我五分钟前刚做了这个,然后来了,看到了这些问题。。。我推荐hashCode方法的这个实现(这只是默认的eclipse实现):
return(31+thing1.hashCode())*31+thing2.hashCode()
@Kip:事实上,我建议使用Apache Commons Lang提供的
HashCodeBuilder
EqualBuilder
、和
CompareToBuilder
。:-)我完全支持谷歌收藏,但我很难理解这是如何工作的。您基本上创建了一个
函数
对象来调用您的
计算机结果
函数。当您从地图中获得适当的项目时,Google对象将负责调用该函数并缓存其值。:-)