我正在制作一个扑克项目,该项目只是从洗牌的牌组中处理5张顶级牌,让用户拒绝全部,部分或全部。据我所知,理想情况下应该有2-3个班级,一个是实际的主,另外两个是卡和卡。我创建了Deck类和一个非常基本的Tester程序,它只是打印洗牌。然而,当我打印甲板时,我得到的东西是" Deck @ ### d ## a"。我做错了什么?
import java.util.Random;
public class Deck {
// Constructing a deck from two arrays
String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" };
String[] rank = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King" };
String[] deck = new String[suit.length * rank.length];
// Storing public variables
int suits = suit.length;
int ranks = rank.length;
int deckSize = deck.length;
public Deck()
{
for(int i = 0; i < suits; i++)
{
for(int j = 0; j < ranks; j++)
{
deck[ranks*i + j] = rank[j] + " of " + suit[i];
}
}
}
// Fisher-Yates Shuffle
public void shuffle()
{
Random rand = new Random();
for (int i = 0; i < deckSize; i++)
{
int x = rand.nextInt(deckSize);
String temp = deck[x];
deck[x] = deck[i];
deck[i] = temp;
}
}
}
测试人员班:
import java.util.Scanner;
public class DeckTester {
public static void main(String[] args) {
Deck deck = new Deck();
System.out.println(deck);
}
}
输出:Deck @ ### d ### a
答案 0 :(得分:2)
您正在从Object类中看到默认的`toString()方法,并且您发现它不太有用。你也没有创建一个Card或一个真正的Deck类,所以你不能给任何类一个像样的toString()方法。
解决方案:
toString()
方法。toString()
方法。如,
// for Deck
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Card card: cards) {
sb.append(card.toString() + ", ");
}
return sb.toString();
}
答案 1 :(得分:0)
打印对象会调用其toString()
方法。如果您的班级或其任何祖先未覆盖toString()
,则会调用默认值,即toString()
的{{1}}方法。
但是默认的Object
并不是很聪明 - 它只是为你提供了套牌的名称和哈希码。
所以非常推荐,对于您要打印的任何类(甚至是那些您不打算但又可能需要调试的类)来覆盖toString()
方法。在重写方法中,您应该构造一个表示类内容的字符串。它可以像在您的情况下调用toString()
一样简单。
另外,请注意您已经定义了一个Arrays.toString()
方法,但实际上并没有从任何地方调用它,因此一旦您成功打印了套牌,它就不会被洗牌。