最有效的方法来构建一副牌(ArrayLists,Arrays等)?

Col*_*ley 0 java arrays arraylist

所以我是Java的新手,并且在数组之前开始使用ArrayLists.我喜欢它们与Python列表更相似,并且理解ArrayLists只包含对象而不是基元,在我看来,它们对包含多个类型的列表更有用.我写这篇文章是为了展示我如何制作一副牌(一切都是静态的,只是为了这个例子):

public class Deck {

    private static Scanner input = new Scanner(System.in);
    private static Random newRan = new Random();

    private static final List RANKS = new ArrayList(Arrays.asList("ace", 2, 3, 4, 5, 6, 7, 8, 9,
            10, "jack", "queen", "king"));
    private static final List SUITS = new ArrayList(Arrays.asList("hearts", "diamonds", "clubs",
            "spades"));

    private static List makeDeck() {
        List result = new ArrayList();
        for (Object i : SUITS) {
            for (Object j : RANKS) {
                result.add(Arrays.asList(i, j));
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List deck = makeDeck();

        for (Object i : deck) {
            System.out.println(i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我相信这可能会减慢程序速度,正如我在别处读到的那样,但我想知道什么是更好,更传统或更干净的方法来实现这一目标?所有建设性批评都受到欢迎.

(同样,我想说我写这个小代码只是为了演示我关于数组和数组列表及其功能的问题,一个简单的例子.)

nas*_*kin 7

枚举!

Enum非常适合Card Suits和Ranks等.实际上,比字符串集更好.例如...

enum Suit {
    HEARTS, SPADES, DIAMONDS, CLUBS;
}
Run Code Online (Sandbox Code Playgroud)

枚举也可以像任何其他类一样拥有自己的属性,但这是您可以单独阅读的内容.Enums的高低是他们在运行时是单身人士,根据定义,每个人都是独一无二的.这些是非常方便的属性.

接下来,我建议你实现一个正式的Card类.卡不仅仅是一个属性列表.你想要这样的东西作为你的Card类的基础:

class Card {
   private final Suit suit;
   private final Rank rank;

   public Card(Suit suit, Rank rank) {
       this.suit = suit;
       this.rank = rank;
   }

   public Suit getSuit() { return this.suit; }

   public Rank getRank() { return this.rank; }
}
Run Code Online (Sandbox Code Playgroud)

您的代码的用户会感谢您,而不是记住列表的第一个元素是套装还是卡的等级.

您必须重构您的makeDeck方法以使用这些新的枚举和类,但一般方法将保持不变.迭代所有的Suits,并在该迭代中迭代所有等级并为每次迭代创建一个新的Card实例.这样,你就可以使用Rank和Suit的每个值制作一张新卡片.你最终得到一个完整的套牌.

现在,你想问自己的问题是:甲板只是卡片列表,还是值得自己上课?没有正确或错误的答案; 这取决于你和你的程序需要什么.也许只使用卡片列表是完全正常的.

哦,并且在那张纸条上(也许这只是一张图片),如果你想要一张"卡片列表",可以把它作为卡片列表.List<Card>比仅仅更好List.通用类型是你的朋友!