不显示任何输出的卡数组

问题描述 投票:0回答:2

为此,我创建了两个java文件。卡片.java 具足 实例变量杰克.java 将只是运行所有的 卡片 当被问及。

我的代码 卡片.java 是。

public class Card {

    private int rank;
    private int suit;


    public Card(int rank, int suit) {

        this.rank = rank;
        this.suit = suit;
    }

    public static final String[] RANKS = {
        null, "Ace", "2", "3", "4", "5", "6", "7",
        "8", "9", "10", "Jack", "Queen", "King"};
    public static final String[] SUITS = {
        "Clubs", "Diamonds", "Hearts", "Spades"};

    public String toString() {
        String s = RANKS[this.rank] + " of " + SUITS[this.suit]; // we are actually using the instances variables to access the array elements 
        return s;

    }

    public boolean equals(Card that) { // this that could be any variables 
        return this.rank == that.rank && this.suit == that.suit;
    }
}

我的代码是: 杰克.java 是。

public class Jack {

    public static void main(String[] args) {

        Card small = new Card(0,1); // creates the small object
        Card card = new Card(11,1); // cretes the card object
        System.out.println(small); // prints the small class
        System.out.println(card); // prints the card class
        System.out.println(small.equals(card)); // compares small with cards

        Card[] cards = new Card[52];

        int index = 0; // to keep track
        for (int suit = 0; suit <= 3; suit++) { // outer loop
            for (int rank = 1; rank <= 13; rank++) { // inner loop
                cards[index] = new Card(rank, suit);
                index++;
            }
        }

        public static void printDeck(Card[] cards) {
            for (Card card : cards) {
                System.out.println(card);
            }
        }   

        System.out.println(Arrays.toString(cards));
    }  
}

所有的代码都能用,但PrintArray不能用。我试图从书上寻求帮助,但我没有得到什么可能的错误。先谢谢你了。我也试过把void方法 printDeck 在Card.java文件中,但我又失败了。

java class variables instance
2个回答
1
投票

问题:你的常量不是。

有公共数组是个坏主意。事实上,你把一个 final 并不能解决这个问题;数组在这里无法实现你想要的东西。我建议你用列表来代替。试试吧 写这个。Card.RANKS[1] = "10"; // hahaha I'm cheating!

试试这个

public static final List<String> RANKS = List.of("", "Ace", "2", "3", ...);

或者更好的是,用java的方式来使用它。用类型和名称。

public enum Rank {
    ACE, R2, R3, R4, R5, R6, R7, R8, R9, R10, JACK, QUEEN, KING;
}

public class Card {
    private final Rank rank;
}

问题: 你的equals不是.

java的工作方式是,一个方法在运行时的名字比单纯的名字要复杂一些。其实就是名字。 所有参数的所有类型,但不包含它们上的任何属姓。 的返回类型。所以,equals的全称其实是 equals(java.lang.Object)boolean. 你的等价法 覆盖,因为它的名字其实并不一样,它的名字是 equals(Card)boolean. 不一样的。对于任何与equals方法交互的代码(如hashmap、hashset、list.contains等),它都不会工作。你应该让你的 equals 方法接受一个 Object,并检查它是否为卡,如果不是,显然,它不等于。所以,加。if (!(that instanceof Card)) return false;. 如果卡不是最终的,更好的检查是 if (that == null || that.getClass() != Card.class) return false; 因为有些复杂的原因。

这是一个伟大的想法,添加 @Override 到任何你认为应该覆盖的方法。这什么都不会做,除非你的方法实际上没有覆盖任何东西,在这种情况下,它会导致编译器告诉你这一点。嘿,伙计--你的假设不成立-- 然后拒绝编译你的代码,这样你就可以修正它了。

问题:null在那里做什么?

你的RANKS以null开头,但你却创建了 new Card(0,1); 这是[A]不可读的,[B]意味着你现在有一个空级。没有必要使用这个空值。另外,如果你使用枚举和类型,它可以变得更可读。new Card(Rank.ACE, Suit.DIAMONDS);.

打印不成功

你把一个方法放在了一个方法中(该方法的 printDeck 方法是在 main 方法)。) Java目前并不支持这一点。移动该方法,使其成为一个兄弟姐妹。


0
投票

您的代码将无法按原样编译。printDeck()方法目前在main()方法的定义中,需要移到外面。移动该方法后,就能按预期运行了。下面是修改后的Jack类。

public class Jack {

    public static void main(String[] args) {

        Card small = new Card(0,1); // creates the small object
        Card card = new Card(11,1); // cretes the card object
        System.out.println(small); // prints the small class
        System.out.println(card); // prints the card class
        System.out.println(small.equals(card)); // compares small with cards

        Card[] cards = new Card[52];

        int index = 0; // to keep track
        for (int suit = 0; suit <= 3; suit++) { // outer loop
            for (int rank = 1; rank <= 13; rank++) { // inner loop
                cards[index] = new Card(rank, suit);
                index++;
            }
        }
       printDeck(cards);
    }

    public static void printDeck(Card[] cards) {
        for (Card card : cards) {
            System.out.println(card);
        }
    }
}

和结果的输出:

null of Diamonds
Jack of Diamonds
false
Ace of Clubs
2 of Clubs
3 of Clubs
4 of Clubs
5 of Clubs
6 of Clubs
7 of Clubs
8 of Clubs
9 of Clubs
10 of Clubs
Jack of Clubs
Queen of Clubs
King of Clubs
Ace of Diamonds
2 of Diamonds
3 of Diamonds
4 of Diamonds
5 of Diamonds
6 of Diamonds
7 of Diamonds
8 of Diamonds
9 of Diamonds
10 of Diamonds
Jack of Diamonds
Queen of Diamonds
King of Diamonds
Ace of Hearts
2 of Hearts
3 of Hearts
4 of Hearts
5 of Hearts
6 of Hearts
7 of Hearts
8 of Hearts
9 of Hearts
10 of Hearts
Jack of Hearts
Queen of Hearts
King of Hearts
Ace of Spades
2 of Spades
3 of Spades
4 of Spades
5 of Spades
6 of Spades
7 of Spades
8 of Spades
9 of Spades
10 of Spades
Jack of Spades
Queen of Spades
King of Spades
© www.soinside.com 2019 - 2024. All rights reserved.