1

我正在努力实现一个 toString 方法来输出一副纸牌(ARRAY)。

我有一个卡片班

public class Card {

    private Rank rank;
    private Suit suit;

    public Card(Rank theRank, Suit theSuit) {
        rank = theRank;
        suit = theSuit;
    }

    public Rank getRank() {
        return rank;
    }

    public Suit getSuit() {
        return suit;
    }

    public String toString() {
        return (rank + " of " + suit);
    }

}

排名实现为枚举

public enum Rank {

    ACE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(
            9), TEN(10), JACK(10), QUEEN(10), KING(10);

    private final int rankValue;

    private Rank(int value) {
        rankValue = value;
    }

    public int getRankValue() {
        return rankValue;
    }

}

套装作为枚举实现

public enum Suit {
    HEARTS, CLUBS, DIAMONDS, SPADES;
}

甲板课

public class Deck {

    private static Card[] cards = new Card[52];

    public Deck() {
        int i = 0;
        for (Suit s : Suit.values()) {
            for (Rank r : Rank.values()) {
                cards[i++] = new Card(r, s);

            }
        }
    }

    public Card[] getCards() {
        return cards;
    }

    // toString METHOD NOT WORKING
    public String toString() {

        String s = ("The Complete Deck consists of: \n" + getCards());

        return s;

    }

}

还有一个 DeckDriver 类(包括 main 方法)

public class TestDeck {

    public static void main(String[] args) {

        System.out.println("*** DISPLAY A FULL DECK OF CARDS ***\n");

        Deck theDeck = new Deck();

        Card[] cards = theDeck.getCards();

        for (Card c : theDeck.getCards()) {
            System.out.println(c);
        }

        // or
        System.out.println("");
        System.out.println(theDeck.toString());

    }

}

第一个 println 语句根据需要打印出来,但我需要在 Deck 类中实现一个 toString() 方法。这是我遇到困难的地方。

从上面的代码(不包括第一个 println 语句的输出),我得到的输出是:

完整套牌包括:[LCard;@2c6f7ce9

任何能让我理解和纠正这个问题的建议都会很棒。

谢谢。

* 编辑 *

所以我尝试了以下方法:

public String toString() {

    String s = ("The Complete Deck consists of: \n" + Arrays
            .toString(cards));
    return s;

}

& 它输出数组,但在一个单一的、宽的、长的行中。有没有办法在新行上打印每个数组元素?

谢谢。

4

4 回答 4

2

您正在看到一个数组的 toString 输出。您需要迭代 Card 数组中的每个项目并输出其 toString 值。或者您可以使用 from 的方法java.util.Arrays并调用Arrays.toString(getCards());

如果您不喜欢输出,那么您必须自己进行迭代并输出(或使用 apache commons 或 guava 中的某些东西或其他东西将数组值连接成一个漂亮、可读的字符串。

像这样的东西应该工作:

public String toString() {
    StringBuilder buf = new StringBuilder( "The Complete Deck consists of: \n" );
    for ( Card card : getCards() ) {
      buf.append( card.toString()).append( "\n" );
    }
    return buf.toString();
}

或使用apache StringUtils

public String toString() {
    return "The Complete Deck consists of: \n" + StringUtils.join( getCards(), "\n" );
}
于 2013-10-21T22:56:17.940 回答
2

您在这里有两个选择。我更喜欢第二个:

将您的getCards()方法更改为

public String getCards(){
    return Arrays.deepToString(cards);
}

更好的是你可以在你的toString()方法中做这样的事情

public String toString() {

    String s = ("The Complete Deck consists of: \n" + Arrays.deepToString(getCards()));

    return s;

}

Arrays.deeptoString()的作用是为您提供数组的字符串表示形式。

更新 1 : - 下面是在新行上打印每个元素的代码。

public String toString(int[] arr) {
        String temp = "";
        for (int i : arr) {
            temp = temp + i + "\n";
        }
        return temp;
    }

更新 2 : - 我的第一个更新是让您了解如何获取一个字符串,该字符串在新行上包含数组中的元素。似乎人们希望我给你确切的代码,你可以粘贴到你的程序中并让它运行

 public String toString() {
            String temp = "";
            for (Card c : Cards) {
                temp = temp + c.toString() + "\n";
            }
            return temp;
        }
于 2013-10-21T22:56:37.250 回答
1

要将 String 与一些非 String 对象连接,Java 使用toSrting()该对象的方法的结果non-string。所以它是一样的"myString" + someObject.toStrint()。在您的情况下,您正在尝试做

"The Complete Deck consists of: \n" + getCards()

并且由于getCards()返回Card[]数组 Java 将toString()在该数组上调用。
数组不会让你覆盖它的toString()方法,并且会使用它继承自 Object 类的版本,它返回

getClass().getName() + "@" + Integer.toHexString(hashCode())

所以你看到[LCard;@2c6f7ce9这意味着

  • 一维数组[L
  • 类型Card对象
  • hashCode十六进制格式为2c6f7ce9.

如果您想创建将表示数组内元素的字符串,您可以使用Arrays.toString(yourArray)或仅迭代数组的所有元素并将它们连接起来。

因此,也许可以将您toString()Deck课堂上的方法更改为类似

public String toString() {
    return  "The Complete Deck consists of: \n" + Arrays.toString(getCards());
}

或者如果您希望每张卡都在新行中

public String toString() {
    StringBuilder sb = new StringBuilder("The Complete Deck consists of: ");
    sb.append(System.lineSeparator());

    for (int i = 0; i < cards.length - 1; i++) {
        sb.append(cards[i].toString()).append(System.lineSeparator());
    }
    sb.append(cards[cards.length - 1]);

    return sb.toString();
}
于 2013-10-21T23:10:52.163 回答
1

Java 的原生数组默认不实现“toString()”。您必须手动执行此操作,方法是在循环中单独添加卡片的 toStrings() 并返回它,或者按照另一个答案中的建议执行类似 Arrays.toString 的操作。

如果您希望卡片显示在单独的行上,则必须像这样实现自己的循环:

public String toString() {
    String str = "";
    for(Card c: cards) {
        str += c.toString() + "\n";
    }
    return str;
}
于 2013-10-21T23:01:04.330 回答