【问题标题】:Array, toString?数组,toString?
【发布时间】:2013-09-23 15:45:56
【问题描述】:

所以我想要做的是打印出这个数组。

    coins[0] = new Coin(CoinName.PENNY, 2011);
    coins[1] = new Coin(CoinName.DIME, 1952);
    coins[2] = new Coin(CoinName.DOLLAR, 1999);
    coins[3] = new Coin(CoinName.NICKEL, 2004);
    coins[4] = new Coin(CoinName.DIME, 1952);
    coins[5] = new Coin(CoinName.DOLLAR, 1945);
    coins[6] = new Coin(CoinName.PENNY, 2011);
    coins[7] = new Coin(CoinName.QUARTER, 1961);
    coins[8] = new Coin(CoinName.NICKEL, 1983);
    coins[9] = new Coin(CoinName.FIFTY_CENT, 1963);

但我知道我可以使用 Arrays.toString 方法,但这次我不能使用它。 我必须使用我自己的名为

的方法
public String toString()

这就是它需要完全设置的方​​式,如何设置的说明在评论中。

//the standard toString method that returns a String listing all the coins in the jar,   in their current order
public String toString()
{
    return ???;

}

数组的初始化在一个名为 CoinJar(Coin[] coin) 的方法中,但在同一个类中。

我不确定我问这个问题是否正确,如果你们需要任何细节,请询问。

【问题讨论】:

  • return "What have you tried?";
  • @RohitJain 我今天的评论投票限制已经取消了,但这一次是史诗般的......
  • 我什至不知道从哪里开始。因为我不能在 return 语句中放一个循环可以吗?
  • return Arrays.toString(coins); 呢?
  • @jlordo。他不能用那个。

标签: java arrays return tostring


【解决方案1】:

用一个完整的例子编辑

您的 Coin 类应如下所示:

public class Coin {
    private CoinName coinName;
    private int year;

    public Coin(CoinName coinName, int year) {
        this.coinName = coinName;
        this.year = year;
    }

    @Override
    public String toString() {  
        return coinName + " " + year;
    }
}

你不知道放什么的方法在里面,我做了这个类来测试我发布的答案:

public class CoinContainer {
    private Coin[] coins;

    public CoinContainer() {  
        coins = new Coin[10];

        coins[0] = new Coin(CoinName.PENNY, 2011);
        coins[1] = new Coin(CoinName.DIME, 1952);
        coins[2] = new Coin(CoinName.DOLLAR, 1999);
        coins[3] = new Coin(CoinName.NICKEL, 2004);
        coins[4] = new Coin(CoinName.DIME, 1952);
        coins[5] = new Coin(CoinName.DOLLAR, 1945);
        coins[6] = new Coin(CoinName.PENNY, 2011);
        coins[7] = new Coin(CoinName.QUARTER, 1961);
        coins[8] = new Coin(CoinName.NICKEL, 1983);
        coins[9] = new Coin(CoinName.FIFTY_CENT, 1963);
    }

    @Override
    public String toString() {
        String myString = "";

        for(Coin coin : coins) {
            myString += coin + "\n";
        }

        return myString;
    }

    public static void main(String[] args) {
        CoinContainer coinContainer = new CoinContainer();

        System.out.println(coinContainer);
    }
}

最后,为了得到一个完整的答案,你的 CoinName 枚举可能看起来像这样:

public enum CoinName {
    PENNY,
    DIME,
    DOLLAR,
    NICKEL,
    QUARTER,
    FIFTY_CENT
}

我对其进行了测试,一切正常。这是我得到的输出:

PENNY 2011
DIME 1952
DOLLAR 1999
NICKEL 2004
DIME 1952
DOLLAR 1945
PENNY 2011
QUARTER 1961
NICKEL 1983
FIFTY_CENT 1963

【讨论】:

  • 我试过了,还是这样的 --- [LCoin;@45e881b6
  • @Marcus 那是因为你还没有覆盖 Coin 类中的 thr ToString 方法。
  • 你所做的就是在它上面输入@Override,对吗?因为我做到了。
  • 那是我的错误。我现在正在使用手机,因此无法验证这一点(我会在一个小时内验证),但请尝试在 Coin 类的 toString 方法中使用 coinName.name() 而不是仅使用 coinName。
  • @MarcusScaffidi 我刚刚在 Eclipse 中测试了所有内容,它无需“.name()”部分即可工作。您确定在 Coin 和包含“coins”数组的类中都覆盖了 toString 方法吗?
【解决方案2】:

在你的硬币类中,将 toString() 重写为这样的:

public String toString()
{
    return this.coinName+ " " + this.year;
}

要打印数组内容,您可以这样做

public String toString()
{
    StringBuffer st = new StringBuffer();
    // or you could use this too...    StringBuilder st = new StringBuilder(); in a performance intensive system, where there is no need of synchronization this would be a little better.
    for(int index = 0; index < coins.length; index++ )
    {
        st.append("Coin "+index+" : "+coins[index].toString());
    }  
    return st.toString(); 

}

【讨论】:

  • 为什么是StringBuffer?如果您不需要同步,请使用StringBuilder
  • 为了安全起见...如果他在多线程环境中使用这段代码会怎样?
  • 即使在多线程环境中,这个操作也是原子的,所以不需要StringBuffer
  • @codeMan:我想写多线程代码的人不会问:我怎么写toString()...
  • @jlordo 我明白了。普通人...... StringBuffer 和 StringBuilder 之间的性能没有太大差异,除非他正在构建实时系统......在 jlordo 的同一行上,我假设他也没有构建 RTS..跨度>
【解决方案3】:

我猜 CoinName 是一个 Enum,所以你的 Coin 对象应该覆盖 toString 方法

为确保您正确覆盖它(如果不这样做,代码将无法编译),您必须使用 @Override 注释方法。

方法可能如下所示:

    @Override
    public String toString() {
        return new StringBuilder("[Name: ")
                .append(name.getName())
                .append(", Year: ")
                .append(year)
                .append("]")
                .toString();
    }

这将打印出漂亮的输出:

[[Name: PENNY, Year: 2011], [Name: DIME, Year: 1952]... ]

【讨论】:

    【解决方案4】:

    重载Coin 类中的默认toString 方法。然后在你自己的 toString 方法中循环 coins 数组并简单地

    public String toString {
        private String s = "";
        for(int i =0; i < coins.length; i++)
            s += coins(i) + ", ";
    
        return s
    }
    

    按照建议,如果需要性能,请改用StringBuilder

    【讨论】:

    • 你没有返回String
    • 您是否忘记插入退货?可怜!
    • 循环中的字符串连接:我们喜欢这样吗?
    • @marianoc84 如果您至少在发布代码之前对其进行测试,您也不会忘记 :)。
    • @marianoc84:不,因为编译器会告诉我以防万一。编写代码时请使用 IDE。它会告诉你你的语法错误。发布的代码中至少还有 3 个。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多