卡数组到字符串 - Java



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

与一些非 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();
}

相关内容

  • 没有找到相关文章

最新更新