我正在努力实现一个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;
}
它输出数组,但在一个很长的,w i d e,长行中。有没有办法在新行上打印每个数组元素?
谢谢。
你看到的是一个数组的toString的输出。 您需要迭代 Card 数组中的每个项目并输出其 toString 值。 或者,您可以使用java.util.Arrays
中的方法并调用Arrays.toString(getCards());
如果你不喜欢输出,那么你必须自己进行迭代和输出(或者使用来自apache commons或番石榴的东西或其他东西将数组值连接到一个漂亮的,可读的字符串中。
这样的事情应该有效:
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" );
}
这里有两个选择。我更喜欢第二个:
将 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;
}
Java的原生数组默认不实现"toString()"。 您必须手动执行此操作,方法是在循环中单独添加卡片的 toStrings() 并返回它,或者按照另一个答案中的建议执行类似 Arrays.toString 的操作。
如果您希望卡片显示在单独的行上,则必须像这样实现自己的循环:
public String toString() {
String str = "";
for(Card c: cards) {
str += c.toString() + "n";
}
return str;
}
与一些非 String 对象连接起来,Java 使用该non-string
对象的toSrting()
方法的结果。所以它和"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)
或只是遍历数组的所有元素并连接它们。
因此,也许可以将Deck
类中的toString()
方法更改为类似
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();
}