【问题标题】:Card array toString - Java卡片数组 toString - Java
【发布时间】:2013-10-30 15:19:14
【问题描述】:

我正在努力实现一个 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;

}

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

谢谢。

【问题讨论】:

  • 检查我的答案。我根据您的要求修改了它

标签: java arrays playing-cards


【解决方案1】:

您正在看到一个数组的 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();
}

apache StringUtils

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

【讨论】:

  • 感谢您的回复。你能指导我如何按照你建议的方式遍历数组吗?
  • 非常感谢!我还不熟悉 StringBuilder,但我将对此进行调查。谢谢。
【解决方案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;
        }

【讨论】:

  • 为什么是 int 数组?为什么不重写继承的 toString?
  • 这是他如何实现在不同行上打印数组元素的示例。 @sdanzig 检查代码的标题是什么。它说明了它的用例。它不是替代用户想要的东西,而是如何实现他想要的东西。
  • 好吧,这让他想了想,很好,但是你为什么要用参数定义 toString 呢?我认为学习 Java 的人看到这一点会感到困惑,因为如果他们尝试自己这样做,传入一个参数,它不会覆盖 Object.toString() 这几乎总是意图。
  • 如果这是您投反对票的原因,请重新考虑,如果代码还有其他问题,请告诉我。对于您的评论,我想让他知道他如何返回一个在新行中显示元素的字符串。但对我来说让它运行它是测试它的最简单方法
  • 感谢您的回复和进一步的更新。看到在不同的上下文中使用 for 循环很有趣。
【解决方案3】:

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

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

public String toString() {
    String str = "";
    for(Card c: cards) {
        str += c.toString() + "\n";
    }
    return str;
}

【讨论】:

  • 感谢您的回复。我在 Card 类中有一个 toString 方法 - 底部/最后一个函数。至少它被命名为 toString()。我是否缺少对如何实现“正确” toString 方法的一些理解?
  • 不,很好,@user2904978 ...我重新格式化了你的代码..缩进让我很困惑。请参阅我的解决方案,让卡片显示在单独的行上。
【解决方案4】:

要将 String 与一些非 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 类型对象
  • 其十六进制格式的hashCode2c6f7ce9

如果你想创建字符串来表示数组中的元素,你可以使用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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2021-05-04
    相关资源
    最近更新 更多