我正在努力实现一个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;
}
}
以Enums实现的套装
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类(包括主要方法)
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;
}
&安培;它输出数组,但是在一条线上,即长线。有没有办法在新行上打印每个数组元素?
感谢。
答案 0 :(得分:2)
您正在查看数组的toString输出。您需要迭代Card数组中的每个项目并输出其toString值。或者您可以使用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();
}
public String toString() {
return "The Complete Deck consists of: \n" + StringUtils.join( getCards(), "\n" );
}
答案 1 :(得分: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;
}
答案 2 :(得分:1)
默认情况下,Java的本机数组不实现“toString()”。您必须手动执行此操作,方法是在循环中单独添加卡的toStrings()并返回,或者按照另一个答案中的建议执行类似Arrays.toString的操作。
如果您希望卡片显示在不同的行上,您必须实现自己的循环:
public String toString() {
String str = "";
for(Card c: cards) {
str += c.toString() + "\n";
}
return str;
}
答案 3 :(得分: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
type objects
hashCode
为2c6f7ce9
。如果要创建将表示数组内部元素的String,可以使用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();
}