Могу ли я использовать оператор == для сравнения объектов Point в Java? - PullRequest
3 голосов
/ 31 июля 2011

Пока я решаю вопросы из книги "Взлом интервью по кодированию" ... у меня есть сомнения. вопрос:

Учитывая два квадрата на двухмерной плоскости, найдите линию, которая разрезала бы эти два квадраты пополам.

Решение: любая линия, проходящая через центр прямоугольника, должна разрезать ее пополам. Поэтому, если вы нарисовали линия, соединяющая центры двух квадратов, разрезает их пополам.

   public class Square {
       public double left;
       public double top;
       public double bottom;
       public double right;
       public Square(double left, double top, double size) {
              this.left = left;
              this.top = top;
              this.bottom = top + size;
              this.right = left + size;
       }

       public Point middle() {
              return new Point((this.left + this.right) / 2,
                                           (this.top + this.bottom) / 2);
       }

       public Line cut(Square other) {
              Point middle_s = this.middle();
              Point middle_t = other.middle();
              if (middle_s == middle_t) {
                     return new Line(new Point(left, top),
                     new Point(right, bottom));
              } else {
                     return new Line(middle_s, middle_t);
              }
       }
}

Но теперь сомнение заключается в том, что оператор '==' в методе вырезания проверяет, являются ли они точками одного квадрата. Точка неизменна ?? пожалуйста, помогите мне ... Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 31 июля 2011

Не имеет значения, является ли Point неизменным.Важно то, что == выполняет сравнение указатель / ссылка.Он проверяет, ссылаются ли middle_s и middle_t на один и тот же экземпляр объекта, а не на то, являются ли они одинаковыми с точки зрения их внутренних полей.

То, что вы, вероятно, хотите сделать, это реализовать / переопределитьequals() для класса Point, так что он сравнивает координаты x и y и возвращает true, если они совпадают.Затем вы можете сравнить свои очки, выполнив if (middle_s.equals(middle_t)).

Когда вы переопределяете equals(), убедитесь, что вы также переопределяете hashCode() соответственно.

2 голосов
/ 31 июля 2011

Неважно, является ли Point неизменным ... реальный вопрос все еще остается.

Важно то, заботитесь ли вы о идентичности точечных объектов - будьэто один и тот же экземпляр - или вы заботитесь о значении точечных объектов.

Здесь, очевидно, вы заботитесь о значении точки, а не о том, какой это экземпляр объекта, поэтомуВы должны использовать middle_s.equals(middle_t).

0 голосов
/ 04 апреля 2014

Из JavaDocs , вы можете использовать метод equals для сравнения двух Point объектов.
Дополнительно: давайте взглянем на страницу разработчика Android для более подробного объяснения:

Сравнивает этот экземпляр с указанным объектом и указывает, если они равны. Чтобы быть равным, o должен представлять тот же объект, что и этот экземпляр с использованием сравнения классов. Генеральный договор является то, что это сравнение должно быть рефлексивным, симметричным и транзитивно. Кроме того, никакая ссылка на объект, кроме нуля, не равна нулю

...