当前位置: 首页 > 知识库问答 >
问题:

在对象和值之间创建映射的最小堆

傅泉
2023-03-14

这些问题是用Java提出的。

我有一个对象,我们把它叫做MyObj。另外,我有一种方法可以为这个对象的每个实例打分。但是,评分也取决于另一个整数值。所以,我使用

在填充这些值时,我希望每次都从当前已知的最小值开始。当我说最小值时,我的意思是在所有可能的MyObj x实例和所有可能的整数I上,我看到的是值的最小值。获取(x,i),它存在于值中(因此,首先,它将是我输入的初始值,然后,取决于计算的值)。

因此,最简单的方法是实现最小堆。为此,我创建了:PriorityQueue

这在第一次迭代中效果很好。问题是,我只知道最小值,而不知道导致该最小值的xI。也就是说,我想让最小堆知道,当我按double的值排序时,我还想保留一个指向这些xI的指针,它们将我带到这个值。

我读了一些关于实现比较器的内容。这意味着,我想创建某种类型的对象,比如说MyObjint的组合,然后为它们实现一个比较器?但是这个比较器将取决于表value esOf中的值。

我不确定这样做是否正确。如果是的话,我有点困惑,不知道该怎么做。但也许有更好的方法?


共有1个答案

琴光亮
2023-03-14

如果要在集合(如PriorityQueue中保留键和值,则需要使用包含所有这些值的引用的对象。而您可以尝试使用像Tuple这样的泛型类

class HeapEntry {
  private MyObj x;
  private int i;
  private double value;

  //constructor, getters and setters omitted
}

然后使用比较器

PriorityQueue<HeapEntry> minHeap = new PriorityQueue(Comparator.comparing(HeapEntry::getValue);

Comparator.comparing(HeapEntry::getValue)正在使用方法引用,也可以重写为Comparator.comparing

//creating an anonymous implementation of Comparator
Comparator<HeapEntry> heapComp = new Comparator<HeapEntry>() {
  public int compare(HeapEntry left, HeapEntry right) {
    //easy to do with primitives
    //if you're using wrapper objects you need to deal with nulls, i.e. decide whether a null value is greater or lower than a non-null value
    return Double.compare(left.getValue(), right.getValue());
  }
};

 类似资料:
  • 下面是Main中的随机客户端列表 第二类:产品(字符串名称、枚举类别、BigDecimal价格) 目标->预期结果:在类Main中,创建类Shopping的实例,其中属性是具有 的映射,并用随机数据//integer-购买了多少产品 null null

  • 我有一个对象,我正试图映射到。现在这个有一个名为的枚举,其中包含一些值。我想使用将它们映射到中的其他枚举值。以下是我到目前为止的代码: 当我尝试编译它时,我得到了错误:

  • 假设我有一组字符串和一个散列函数(或任何单边函数)和一个测试函数。我想用Java8流创建一个从输入字符串到通过测试函数的哈希值的映射。我的问题是如何在中编写? 看来老的for循环是最简洁的解决方案。

  • 问题内容: 比如说我有一个叫做Phone的类。 之间有什么区别? 和 和 我已经搜索过,甚至在Eclipse上尝试过,但无法弄清楚。 问题答案: 只声明一个引用处理程序,该处理程序不会指向任何地方(它是未初始化的,除非您为其分配了某些内容,否则无法使用[感谢@Anthony])。 声明一个引用处理程序,该处理程序指向一个新创建的对象(用初始化)。 创建一个新对象,但是由于没有引用存储在任何地方,因

  • 那么地图和物体有什么区别呢?map还将键类型转换为字符串。

  • 问题内容: 请说明对象一和对象二的区别: 欧宝级扩展了轿车。 问题答案: 您可以重新分配给的其他某个子类的对象: 但是您不能那样重新分配,因为它仅限于。 如果是在类中定义的方法,而不是在类中定义的方法,则如果这样做,编译器将给您一个错误: 但这没关系: 由于它知道仅限于,因此它知道该方法将存在。 通常,您希望将变量声明为尽可能 广泛的 类型。也就是说,如果您仅要使用中的方法,则请使用type声明它