Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > String'овое представление части объекта (вопрос)


Автор: BlHol 25.1.2007, 10:52
Добрый день!

Исходные данные.
Есть класс, создающий точку на плоскости с координатами x,y.

В том же классе, хочу добавить метод переводящий декартовы координаты в полярные. Причем, нужно чтобы перевод обеих координат был в пределах одного метода и полярные координаты возвращались из метода в виде объекта (чтоб обе сразу, а не на каждую по методу:

Код

public class myPoint
{

............................
  public myPoint coordPol()
    {
      myPoint coords = new myPoint(x,y);

      rad = Math.sqrt(x*x+y*y);
      phi = .........;

      return coords;

    }

public String toString()

{
return Double.toString(x) + "  " + y + "  " + rad+ "  " + phi;
}

private double x;
private double y;

private double rad;
private double phi;


}


Проблема в строковом представлении.
При указанной выше перегрузке toString(), при вызове данного класса выдаются все четыре координаты. А мне нужно, чтобы выводились только те пары координат, которые требуются.
Если в toString() указывать только x и y, то rad и phi вообще не выдаются. Вторая перегрузка toString() не получается.

Вобщем, что делать?

Заранее благодарен.
С уважением

Автор: Alagert 25.1.2007, 10:57
Как то пространно ты объясняешь smile Скажи точно какие координаты ты хочешь чтобы выводились: только декартовы, только полярные или то и др.
Ща у тебя явно написан вывод и декартовых и полярных. Так что не удивляйся, что выводится их 4 штуки.

Автор: powerOn 25.1.2007, 10:58
добавь к примеру флаг, значение которого будет идентифицировать в каком виде возвращать координаты. В методе toString() проверяй состояние флага и в зависимости он него делай возврат. Либо полярные, либо декартовые.

Код

boolean flag = false;
public String toString()
{
        String ret;
        if (flag) {
          ret = "" +  x + "  " + y;
        } else {
          ret = "" + rad + "  " + phi;
        }
        return ret;
}

Автор: BlackStar 25.1.2007, 11:03
А почему бы не создать отдельный метод для каждого представления (eg. getPolarStr())  ?
А если уж есть необходимость в toString() то тогда добавить флаг и метод который его выставляет в класс и в зависимости от флага возвращать нужное представление.

UPD: Oops! Мои мысли уже прочитаны powerOn  smile 

Автор: LSD 25.1.2007, 12:01
Цитата(BlHol @  25.1.2007,  10:52 Найти цитируемый пост)
Вобщем, что делать?

Метод toString() предназначен для отладки (запись в логи и т.п.), и должен выдавать максимально полную информацию об объекте. 
А для отображения пользователю создан класс Format.
Код
import java.text.*;

public class PointFormat extends Format
{
  private String format;

  public PointFormat(String format)
  {
    this.format = format;
  }

  public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos)
  {
    return format((Point) obj, toAppendTo, pos);
  }

  public StringBuffer format(Point point, StringBuffer toAppendTo, FieldPosition pos)
  {
    String result = format.replaceAll("X", Double.toString(point.getX()));
    result = result.replaceAll("Y", Double.toString(point.getY()));
    result = result.replaceAll("PHI", Double.toString(point.getPhi()));
    result = result.replaceAll("RAD", Double.toString(point.getRad()));
    toAppendTo.append(result);
    pos.setEndIndex(result.length() + pos.getBeginIndex());
    return toAppendTo;
  }

  public Object parseObject(String source, ParsePosition pos)
  {
    throw new UnsupportedOperationException("Method not implemented");
  }

  public static void main(String[] args)
  {
    PointFormat format = new PointFormat("Point[X, Y]");
    Point point = new Point(1, 2, 3, 4);
    System.out.println(format.format(point));
    format = new PointFormat("Point[PHI, RAD]");
    System.out.println(format.format(point));
  }
}

class Point
{
  private double x, y, rad, phi;

  public Point(double x, double y, double rad, double phi)
  {
    this.x = x;
    this.y = y;
    this.rad = rad;
    this.phi = phi;
  }

  public double getX()
  {
    return x;
  }

  public void setX(double x)
  {
    this.x = x;
  }

  public double getY()
  {
    return y;
  }

  public void setY(double y)
  {
    this.y = y;
  }

  public double getRad()
  {
    return rad;
  }

  public void setRad(double rad)
  {
    this.rad = rad;
  }

  public double getPhi()
  {
    return phi;
  }

  public void setPhi(double phi)
  {
    this.phi = phi;
  }
}

Автор: BlHol 25.1.2007, 12:02
С флагом идею уже думал. Но хочу туда добавить еще методы для перевода декартовых координат в сферические и цилиндрические. Тогда, как флаг использовать?

Автор: LSD 25.1.2007, 12:04
Ну или реализовать интефейс Formattable из JDK 1.5 и печетать через printf().

Автор: BlackStar 25.1.2007, 12:11
Цитата

С флагом идею уже думал. Но хочу туда добавить еще методы для перевода декартовых координат в сферические и цилиндрические. Тогда, как флаг использовать?


Подсказка: флаг не обязательно должен иметь тип boolean.

Автор: BlHol 25.1.2007, 13:26
С флагом все замечательно. А если нужно вывести, в том числе, и все четыре координаты. Потом там еще и сферические с цилиндрическими появятся. Их тоже нужно будет выводить либо по-отдельности (попарно), либо в сочетании с другими. Как, в данном случае, быть?

Автор: LSD 25.1.2007, 13:29
Цитата(BlHol @  25.1.2007,  13:26 Найти цитируемый пост)
С флагом все замечательно. А если нужно вывести, в том числе, и все четыре координаты. Потом там еще и сферические с цилиндрическими появятся. Их тоже нужно будет выводить либо по-отдельности (попарно), либо в сочетании с другими. Как, в данном случае, быть?

Используй форматер.

Автор: Shurr 26.1.2007, 11:34
Цитата(BlHol @ 25.1.2007,  12:26)
С флагом все замечательно. А если нужно вывести, в том числе, и все четыре координаты. Потом там еще и сферические с цилиндрическими появятся. Их тоже нужно будет выводить либо по-отдельности (попарно), либо в сочетании с другими. Как, в данном случае, быть?

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)