4、ArrayList的使用
4.1 ArrayList的遍历
对于顺序表的遍历,我们可以通过 for 循环,for-each,以及迭代器的方法遍历:
public class TestArrayList { public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(1); arrayList.add(2); arrayList.add(3); // 通过for循环遍历ArrayList for (int i = 0; i < arrayList.size(); i++) { System.out.print(arrayList.get(i) + " "); } // 通过for-each循环遍历ArrayList for (Integer integer : arrayList) { System.out.print(integer + " "); } // 通过迭代器遍历ArrayList(了解即可) Iterator<Integer> it = arrayList.iterator(); while (it.hasNext()) { System.out.print(it.next() + " "); } } }
4.2 扑克牌例子
这里我们要运用我们上面学的知识写一个扑克牌的例子:
4.2.1 准备工作
首先我们肯定有一个类把我们的一张扑克抽象出来,扑克有花色和点数,那么我们就可以这样写:
public class Poker { private String decor; private int number; public Poker(String decor, int number) { this.decor = decor; this.number = number; } @Override public String toString() { return this.decor + this.number; } }
那么我们还得需要表示多张扑克牌,同时也需要一个存放扑克牌的容器,这里我们选用 ArrayList,同时还需要一个数组来存储对应花色。
public class Pokers { private final String[] decor = { "♥", "♠", "♣", "♦" }; private List<Poker> pokerList = new ArrayList<>(); // 获取花色 public String get(int index) { return decor[index]; } }
这里为什么可以使用 List 接收 ArrayList 的对象呢?因为 List 是一个接口,ArrayList 实现了这个接口,所以这里就实现了向上转型。
4.2.2 买一副牌逻辑
准备工作都做好了,我们要实现买一副牌的逻辑,除了大小王一共有52张牌,我们这里用11 12 13 代替 J Q K,每张牌一共有四种花色,也就是定义一个双层循环遍历放入到我们的容器中即可,最后在放入我们的大小王,这里不涉及太复杂,就定大小王的点数为0!
4.2.3 洗牌逻辑
买一副扑克牌的逻辑写好了,那么现在就应该洗牌了,那么洗牌应该怎么去实现他呢?
我们可以运用 Random 类中产生随机数方法,但是产生了随机数,如何打乱牌呢?
如果从最后一个开始洗,即 last 位置开始,产生 last 的随机数是 [0~last) ,不包含last,所以我们可以从后往前洗牌,每次把最后一张牌与产生的随机数位置的牌交换即可。(不考虑业务性)
4.2.3 发牌逻辑(重点)
如何去模拟实现发牌呢?一共有三个人打牌,每个人轮流摸牌,如果是54张牌要摸18轮,摸到的牌是不是也应该放到对应的人手上,站在编程的角度,应该摸到的牌应该放在对应那个人的容器中。
如何表示我们上述的设想呢?假设我们有一个顺序表,一共三个元素,分别代表三个人,而每个元素里面又放着一个顺序表,而这个顺序表对应着这个人摸到的牌!我们就能画出这样的图:
通过图我们想一想,这个结构不就是有一个ArrayList吗?然后ArrayList里面放的元素类型还是ArrayList,我们要传什么实参类型进去呢?当然是Poker了啊,因为里面的ArrayList最后是要放扑克牌的!于是我们就能写出这样的代码:
这里我们要说一点,发牌的时候,每次都是删除第一张牌,并且把删除的第一张牌增加到对应用户的手牌中,这样也就形成了摸牌逻辑,最后把牌打印出来就好了!
4.2.4 测试整体逻辑
最终我们在main方法中调用如上的 testGame方法实现的是这样一个效果:
到这就实现的差不多啦!买牌,洗牌,发牌逻辑都没问题,这个小练习,不涉及业务,我们主要是把学习的顺序表知识运用起来,听博主一句话,学数据结构,多敲代码多画图!