【问题标题】:how can a subclass use the superclass's comparator?子类如何使用超类的比较器?
【发布时间】:2021-04-07 07:02:49
【问题描述】:

在名为“比较器”的超类中有一个比较器。 在子类中,我想比较它的两个对象,如何使用超类的比较器来比较它们?

这个语句在超类中(已经在子类的构造函数中初始化):

    final Comparator<Node> comparator;

这个函数在子类中:

 /**
 * judge wheter pq[i] is less than pq[j]
 * @param i
 * @param j
 * @return true if pq[i] is less than pq[j]
 */
private boolean less(int i, int j) {

}

我想用比较器比较函数'less'中的pq[i]和pq[j],我该怎么做呢?

【问题讨论】:

  • 如果pqNodes 的数组,那么您可以像使用任何其他比较器一样使用比较器。它在超类中的事实并不重要。
  • 对不起,我是初学者,你能给我看看例子吗?非常感谢!
  • 是的,pq是一个Node数组。
  • comparator.compare(pq[i], pq[j]) &lt; 0 假设 comparator 对子类可见
  • @MakeItPossible 看到你提供了父类的0代码,我们怎么知道没有方法可以让子类使用呢?此外,在您的示例中,它是最终成员,而不是私有成员,这使得它可以在子类中使用。如果你真的展示了你的实际代码,而不是“可能看起来有点”的东西,那将是最好的。

标签: java comparator


【解决方案1】:

对于子类使用在超类上定义的Comparator 没有问题。下面给出了一个简单的演示(注意:不遵循最佳实践)。

演示:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

class A {
    int x;

    @Override
    public String toString() {
        return "x=" + x;
    }
}

class B extends A {

}

public class Main {
    public static void main(String[] args) {
        Comparator<A> comp = (a1, a2) -> Integer.compare(a1.x, a2.x);
        
        B b1 = new B(); b1.x = 10;
        B b2 = new B(); b2.x = 5;
        B b3 = new B(); b3.x = 15;
        List<B> list = new ArrayList<>(List.of(b1, b2, b3));
        
        list.sort(comp);
        System.out.println(list);
    }
}

输出:

[x=5, x=10, x=15]

更新:

感谢Holger

您可以将Comparator&lt;A&gt; comp = (a1, a2) -&gt; Integer.compare(a1.x, a2.x) 替换为Comparator&lt;A&gt; comp = Comparator.comparingInt(a -&gt; a.x)

【讨论】:

  • 但是这个想法是这样说的:“比较器”在“core.solver.heuristic.AbstractFrontier”中是不公开的。无法从外部包访问
  • 赞成。我会使用(a1, a2) -&gt; Integer.compare(a1.x, a2.x) 来强调比较器指的是A 超类。
  • @MakeItPossible 'not public' 并不自动意味着'private'。在您发布的代码中,它是“受保护的”,因此可以在子类中访问
  • @dariosicily 或 Comparator&lt;A&gt; comp = Comparator.comparingInt(a -&gt; a.x);
  • @Holger 谢谢你的提醒,当我使用Supplier&lt;Integer&gt; 而不是IntSupplier 或类似的时候,我完全忘记了它。
【解决方案2】:

您可以简单地使用Comparatorcompare 方法,当第一个对象大于时返回正数,当对象相等时返回0,当第一个对象小于第二个时返回负数。


    /**
     * judge wheter pq[i] is less than pq[j]
     * @param i
     * @param j
     * @return true if pq[i] is less than pq[j]
     */
    private boolean less(int i, int j) {
        return comparator.compare(pq[i], pq[j]) < 0;
    }

【讨论】:

  • 但是这个想法是这样说的:“比较器”在“core.solver.heuristic.AbstractFrontier”中是不公开的。无法从外部包访问
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
相关资源
最近更新 更多