Java 为嵌套类编写toString方法

Java 为嵌套类编写toString方法,java,tostring,Java,Tostring,我试图为一个内部有一个类的类编写一个toString()方法,但我遇到了一些问题。我曾考虑在每个数组中循环,但没有正确地执行。任何建议都很好 public class MarketDataListLevel2 { public static class BidAskList { protected MarketData Bid; protected MarketData Ask; private BidAskList(@JsonProp

我试图为一个内部有一个类的类编写一个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个字段的对象

编辑:

这是我想要输出的数据类型:

{“Top10BidAsks”:[ {“出价”:{“价格”:10.0,“大小”:2.0,“交换ID”:“智能”,“时间戳”:0}, “询问”:{“价格”:12.0,“大小”:2.0,“交换ID”:“智能”,“时间戳”:0}, {“出价”:{“价格”:0.0,“大小”:0.0,“交换ID”:“智能”,“时间戳”:0}, “询问”:{“价格”:13.0,“大小”:12.0,“交换ID”:“智能”,“时间戳”:0}] }

正如您所看到的,{“Price”:10.0,“Size”:2.0,“ExchangeID”:“SMART”,“timeStamp”:0}实际上是从我的MarketData类构造的4个字段

bid和ask本质上是一个对象(由两个Marketdata对象组成的内部类)。最后,整个对象是MarketDataListLevel2类


基本上,我希望我的toString方法能够输出数据,这涉及所有3个类

你可能想得太多了

根据定义,内部类是由类单独访问的东西,因此在大多数情况下,即使知道正在使用内部类,也不需要任何外部类。因此,正如前面提到的其他方法一样,您不需要为内部类实现toString方法


但是如果你真的想传递这些信息,你可以把它设置成一个扩展类,反过来。。。您可以在内部类中实现toString,然后在外部类的toString中引用该innerClass.toString()。

您可能对这个问题想得太多了

根据定义,内部类是由类单独访问的东西,因此在大多数情况下,即使知道正在使用内部类,也不需要任何外部类。因此,正如前面提到的其他方法一样,您不需要为内部类实现toString方法

但是如果你真的想传递这些信息,你可以把它设置成一个扩展类,反过来。。。您可以在内部类中实现toString,然后在外部类的toString中引用该innerClass.toString()

public String toString() {
        // Not finished
        return "\nMarketDataDepth:"
        + Arrays.toString(BidAskList.Ask)
        + "\n";
    }
这甚至不应该编译
BidAskList的
Ask
字段是
非静态的
。再次声明:

protected BidAskList[] BidAskList;
混淆语句
BidAskList.Ask
。编译器将以数组形式读取
BidAskList
,因此将给出错误:
无法在代码中找到symbol:symbol变量Ask

public String toString() {
        // Not finished
        return "\nMarketDataDepth:"
        + Arrays.toString(BidAskList.Ask)
        + "\n";
    }
这甚至不应该编译
BidAskList的
Ask
字段是
非静态的
。再次声明:

protected BidAskList[] BidAskList;

混淆语句
BidAskList.Ask
。编译器将把
BidAskList
作为数组读取,因此会给出错误:
找不到符号:符号变量Ask
我建议您将内部类BidAskList重命名为BidAsk。它不是一个真正的列表,只是包含两个字段:出价和出价。(重命名可能有助于消除您的一些困惑。)

我还建议您将MarketData类型更改为double(或float,取决于您的数据)

您还应该将字段(如“出价”和“询问”)命名为以小写字母开头

下面有两个toString()方法。内部类中的一个将BidAsk打印为
[45.45 x 45.47]
。另一个在外部类中,使用foreach循环打印每个bitask

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();
    }
}

我建议您将内部类BidAskList重命名为bidaskl。它不是一个真正的列表,只是包含两个字段:出价和出价。(重命名可能有助于消除您的一些困惑。)

我还建议您将MarketData类型更改为double(或float,取决于您的数据)

您还应该将字段(如“出价”和“询问”)命名为以小写字母开头

下面有两个toString()方法。内部类中的一个将BidAsk打印为
[45.45 x 45.47]
。另一个在外部类中,使用foreach循环打印每个bitask

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();
    }
}

实际返回的是什么?那么您希望结果是什么?为什么同时有一个名为
BidAskList
的字段和类?(为什么要以字段开头?如果遵循正常的Java命名约定,阅读代码会容易得多。)Java中的实例名称不应该以大写字母开头,您可以比“没有正确执行”更具体一些吗?我的意思是,我们非常棒,但我们不能读心。你没有循环任何东西,所以“我在考虑循环每个数组,但我没有正确地做”这句话并不能告诉我们太多。实际返回的是什么?那么你希望结果是什么?为什么同时有一个名为
BidAskList
的字段和类?(为什么要以字段开头?如果遵循正常的Java命名约定,阅读代码会容易得多。)Java中的实例名称不应该以大写字母开头,您可以比“没有正确执行”更具体一些吗?我的意思是,我们非常棒,但我们不能读心术。你没有循环任何东西,所以“我在考虑循环每个数组,但我没有正确执行”这句话并不能告诉我们太多。谢谢,这非常有效。非常欢迎你!根据您的编辑,我在MarketData中看到了四个项目(价格、大小、交换和路由)。我建议您将BidTask中的字段从double back更改为MarketData。向打印这四个字段的MarketData类添加一个toString()方法。然后更改BidAsk中的toString(),使其在Bid之前添加“Bid”字符串,在Ask之前添加“Ask”。谢谢,这非常有效。非常欢迎!根据您的编辑,我在