java - 努力理解图形组中的等于

标签 java

我有这个类,它包含在一个可以包含CircleTriangle的组中。

public class FiguresGroup {
private static final int NUM_FIGURES = 10;
private Figure[] figuresList = new Figure[NUM_FIGURES];
private int numF = 0;

public void add(Figure f) { figuresList[numF++] = f; }

public String toString() {
    String s = "";
    for (int i = 0; i < numF; i++) {
        s += "\n" + figuresList[i];
    }
    return s;
}

private boolean found(Figure f) {
    for (int i = 0; i < numF; i++) {
        if (figuresList[i].equals(f)) return true;
    }
    return false;
}

private boolean included(FiguresGroup g) {
    for (int i = 0; i < g.numF; i++) {
        if (!found(g.figuresList[i])) return false;
    }
    return true;
}

private boolean equals(FiguresGroup g) {
    if (g.included(this) && this.included(g)) return true;
}

我不知道如何实现equals。我尝试了你在这里看到的内容,但它不起作用。 为了使两个组相等,一个组必须包含另一个组中的所有元素,反之亦然。如何做到这一点?

最佳答案

您错过了两个对象的 numF 的条件, 并且 equals 实现存在编译错误。

另请注意,found 方法(取决于 included)取决于 Figure.equals 的正确实现。 如果正确实现,则可以通过以下方式修复 FiguresGroup.equals:

  private boolean equals(FiguresGroup g) {
    return numF == g.numF && g.included(this) && this.included(g);
  }

此外,FiguresGroup.equals 不会覆盖 Object.equals,这令人困惑。事实上,你可能已经对此感到困惑了。当您在此类之外调用figuresGroup.equals时,代码会编译, 即使这个方法是私有(private)的, 因为实际上将调用 Object.equals 而不是这个私有(private)方法。

您可以通过覆盖Object.equals来解决这个问题:

  @Override
  public boolean equals(Object obj) {
    if (!(obj instanceof FiguresGroup)) {
      return false;
    }
    FiguresGroup other = (FiguresGroup) obj;
    return numF == other.numF && other.included(this) && this.included(other);
  }

关于java - 努力理解图形组中的等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46618223/

相关文章:

java - java中如何扩展抽象类

java - 使用JAVA合并多个XML文件的不同节点

java - RuntimeException : Unable to start activity(MainActivity cannot be cast to android. View .View$OnClickListener)

java - 依赖注入(inject)是如何手动实现的?

java - JodaTime 没有解析它应该解析的内容?

Java.util.Scanner 转 int

java - Errai 中@Default 字段的模糊解析

java - 如何在 AWS Lambda 中调用受 SSL 保护的 REST 服务

java - 为什么G1垃圾收集器在完整垃圾收集中使用单线程?

Java spring security - 拦截不同登录的子域url?