Расстояние между 3 точками с использованием универсального класса / методов

#java #generics #coordinates #distance #point

#java #общие #координаты #расстояние #точка

Вопрос:

Я должен возвращать расстояние от (0,0) точки до this точки, а метод distance должен возвращать расстояние от this до p . Я новичок в Java и универсальных классах / методах. В моем методе расстояния есть ошибка, но я думаю, что я на правильном пути. Методы в CharNumber должны возвращать значение частного поля aChar и преобразовывать его в числовые значения.

 public class Point <T extends Number> {
  private T x;
  private T y;

  public Point(T x, T y){

  }

  public T getX() {
    return x;
  }

  public T getY() {
    return y;
  }

  public double radius(){
    return Math.sqrt(
        Math.pow(x.doubleValue() - 0.0, 2)
              Math.pow(y.doubleValue() - 0.0,2));
  }

  public double distance(Point p){
    return Math.sqrt(
        Math.pow(this.x.doubleValue() - p.getX(), 2)
              Math.pow(this.y.doubleValue() - p.getY(), 2));
  }

  @Override
  public String toString() {
    return "Point{"
          "x="   x
          ", y="   y   "}";
  }
}
  

 public class CharNumber extends java.lang.Number {
  private char aChar;

  public CharNumber(char c){// FIXME: 10/10/16

  }

  @Override
  public String toString() {
    return "CharNumber{"
          "aChar="   aChar   "}";
  }

  @Override
  public int intValue() {
    return 0;
  }

  @Override
  public long longValue() {
    return 0;
  }

  @Override
  public float floatValue() {
    return 0;
  }

  @Override
  public double doubleValue() {
    return 0;
  }
}
  

ОБНОВЛЕННЫЙ КЛАСС POINT

  public class Point <T extends Number> {
private T x;
private T y;
public Point(T x, T y){
    this.x = x;
    this.y = y;

}

public T getX() {
    return x;
}

public T getY() {
    return y;
}
public double radius(){
    return   Math.sqrt(Math.pow(x.doubleValue()-0.0, 2) Math.pow(y.doubleValue()-0.0,2));
}

public double distance(Point<Number> p){
    return Math.sqrt(Math.pow(this.x.doubleValue() - p.getX().doubleValue(),2)
              Math.pow(this.y.doubleValue() - p.getY().doubleValue(),2));
}

@Override
public String toString() {
    return "Point{"  
            "x="   x  
            ", y="   y  
            '}';
}
public static void main(String args[]){// FIXME: 10/10/16
    Point<Integer> p = new Point<>(1,1);
    Point<Double> p2 = new Point<>(2.5,3.4);
    Point<CharNumber> p3 = new Point(5,6);


    System.out.println(p);
    System.out.println(p2);
    System.out.println(p3);
}
  

}
Как мне вызвать методы distance и radius в моем основном методе?

Комментарии:

1. Используйте p.getX().doubleValue() и p.getY().doubleValue() .

2. Вместо этого.x.doubleValue() — p.getX(),2?

3. Вместо этого при использовании p.getX() вам нужно будет использовать p.getX().doubleValue() . Аналогично для значений Y.

4. Помните о hypot методе в Math классе. Это часто более точно, чем все это возведение в квадрат и извлечение квадратного корня.

Ответ №1:

Конструктор должен присваивать полям.

 private final T x;
private final T y;

public Point(T x, T y) {
    this.x = x;
    this.y = y;
}
  

И

 private final char aChar;

public CharNumber(char c) {
    aChar = c;
}
  

И как прокомментировано:

 public <U extends Number> double distance(Point<U> p) {
    return Math.sqrt(Math.pow(x.doubleValue() - p.getX().doubleValue(), 2)
          Math.pow(y.doubleValue() - p.getY().doubleValue(), 2));
}
  

или даже

 public <U extends Number> double distance(Point<U> p) {
    return Math.hypot(x.doubleValue() - p.x.doubleValue(),
        y.doubleValue() - p.y.doubleValue());
}
  

Если класс Point является неизменяемым, не может изменять свои координаты, то поля можно сделать окончательными. Это позволяет назначать переменные друг другу (совместно использовать значения точек).

Параметр Point также должен быть типизирован в общем виде.

Остается несколько вещей, но это вы знаете.

Комментарии:

1. В то время в вашем ответе был только первый. Я удалю свой комментарий.

2. Я не уверен, должны ли мы завершать переменные… нужно ли их доработать? Я также должен создать main, который создает точку с целочисленными значениями, одну с двойными значениями и одну со значениями CharNumber. Затем выведите возврат toString и возврат из radius из 3 созданных мной точек.

3. Было бы неплохо, если бы у вас не было таких методов, как translate / move, которые изменяют поля. Но я бы не final стал, если бы не подчеркивал в курсе.