2013-11-06 3 views
1

Я пытаюсь написать метод toString() для класса с внутренним классом внутри него, и у меня возникают проблемы с этим. Я думал о переходе через каждый массив, но я не делал этого правильно. Любые предложения были бы замечательными.Написание метода toString для вложенного класса

public class MarketDataListLevel2 { 

    public static class BidAskList { 
     protected MarketData Bid; 
     protected MarketData Ask; 
     private BidAskList(@JsonProperty("Bid") MarketData Bid, @JsonProperty("Ask") MarketData Ask) { 
      this.Bid = Bid; 
      this.Ask = Ask; 
     } 
    } 

    protected BidAskList[] BidAskList; 
    public MarketDataListLevel2(@JsonProperty("Top10BidAsks") BidAskList[] BidAskList) { 
     this.BidAskList = BidAskList; 
    }  

    public String toString() { 
     // Will make an edit to this later 
    } 
} 

MarketData - это по существу объект с 4 полями.

EDIT:

Это своего рода данные, которые я хочу, выводимый:

{ "Top10BidAsks": [ { "Bid": { "Цена": 10,0, "Размер": 2,0, «ExchangeID»: «SMART», «TimeStamp»: 0}, «Спросить»: {«Цена»: 12,0, «Размер»: 2,0, «ExchangeID»: «SMART», «TimeStamp»: 0}}, {«Bid»: {«Цена»: 0.0, «Размер»: 0.0, «ExchangeID»: «SMART», «TimeStamp»: 0}, «Спросить»: {«Цена»: 13,0, «Размер»: 12,0 , «ExchangeID»: «SMART», «TimeStamp»: 0}}] }

As вы можете увидеть {«Цена»: 10.0, «Размер»: 2.0, «ExchangeID»: «SMART», «TimeStamp»: 0} - это по существу 4 поля, построенные из моего класса MarketData.

Заявка и запрос - это по существу один объект (внутренний класс, созданный из двух объектов Marketdata). И, наконец, весь объект является классом MarketDataListLevel2.

В принципе, я хочу, чтобы мой метод toString мог выводить данные, которые включают все 3 из этих классов.

+0

Что на самом деле возвращается как есть? – nhgrif

+2

Ну что вы хотите, чтобы результат был? И почему у вас есть поле и класс под названием «BidAskList»? (Почему ваши поля PascalCased начинаются с? Было бы намного легче прочитать код, если бы вы соблюдали обычные соглашения об именах Java.) –

+0

имя экземпляра в java не должно начинаться с заглавной буквы – Sage

ответ

1

Предлагаю вам переименовать свой внутренний класс BidAskList в BidAsk. Это не список, а просто содержит два поля Bid и Ask. (Переименование может помочь вам в некоторой путанице.)

Я также предложил бы, чтобы вы изменили тип MarketData, чтобы удвоить (или поплавать, в зависимости от ваших данных).

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

Следующие два метода toString(). Второй во внутреннем классе выдает BidAsk как [45.45 x 45.47]. Другой, во внешнем классе, использует цикл foreach для печати каждого BidAsk.

public class MarketDataListLevel2 { 

    public class BidAsk { 
     protected double bid; 
     protected double ask; 
     private BidAsk(double bid, double ask) { 
      this.bid = bid; 
      this.ask = ask; 
     } 
     public String toString() { return "[" + bid + " x " + ask + "]"; } 
    } 

    protected BidAsk[] bidAskList; 
    public MarketDataListLevel2(BidAsk[] bidAskList) { 
     this.bidAskList = bidAskList; 
    }  

    public String toString() { 
     StringBuilder ans = new StringBuilder(); 
     for (BidAsk bidAsk : bidAskList) { 
      ans.append(bidAsk.toString()); 
     } 
     return ans.toString(); 
    } 
} 
+0

Спасибо, что сработало отлично. – user1413969

+0

Добро пожаловать! На основе вашего редактирования я вижу четыре элемента в MarketData (цена, размер, обмен и маршрутизация). Я бы предложил, чтобы вы изменили поля в BidAsk с двойного возврата на MarketData. Добавьте метод toString() в класс MarketData, который выводит эти четыре поля. Затем измените значение toString() в BidAsk, чтобы оно добавило строку «Bid» перед началом торгов и «Ask» перед запросом. – rajah9

2

Возможно, вы можете переусердствовать.

Внутренний класс по определению - это что-то частное доступное вашему классу, поэтому в большинстве ситуаций вам не нужны внешние классы, даже зная, что вы используете внутренний класс. Так, как и другие, упомянутые выше, вы не нуждаетесь в , чтобы реализовать метод toString для вашего внутреннего класса.

Но если вы действительно хотите передать эту информацию вместе вы бы настроить его вид как расширенный класс в обратном направлении ... вы бы реализовать ToString в своем внутреннем классе, а затем ссылаться на что innerClass.toString() в ваш toString вашего внешнего класса.

1

В коде:

public String toString() { 
     // Not finished 
     return "\nMarketDataDepth:" 
     + Arrays.toString(BidAskList.Ask) 
     + "\n"; 
    } 

Это не должно даже скомпилировать. BidAskList'sAsk район non-static. Опять же ваше заявление:

protected BidAskList[] BidAskList; 

путает заявление BidAskList.Ask. Компилятор будет читать BidAskList в виде массива и, следовательно, даст ошибку: can not find symbol : symbol variable Ask

Смежные вопросы