[Java]ArrayList 的应用--(扑克牌,杨辉三角)

目录

前言

一.扑克牌发牌器

1)购买扑克牌:

 2)洗牌:

3)发牌:(四个人轮流发13张牌)

二.杨辉三角

三.删除第一个字符串中出现的第二个字符串的字符.(CETV面试题)

总结



前言

        了解ArrayList的底层构造原理和简单操作方法后,为了能更加灵活的应用ArrayList,需要做一些以ArrayList为基本实现方法的习题,加深对知识的灵活应用能力.所以今天为为大家带来三道非常经典的题目讲解--扑克牌发牌器,杨辉三角,删除重复元素.


一.扑克牌发牌器

        为了模拟实现一个扑克牌发牌器,我们需要做的操作有:

        1.购买扑克牌.

        2.打乱扑克牌的顺序.

        3.为指定的人数轮流发牌.

1)购买扑克牌:

        由扑克牌的基本特点可知,一张扑克牌需要有花色数字,所以我们首先要将扑克牌面向对象,创建一个扑克牌类,其中包含花色数字,并重写其中的toString()方法,以便更好的表示扑克牌.

class Card {
    private int rank;
    private String suit;

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public String toString() {
        return "[" + this.suit + " " + this.rank + "]";
    }
}

        创建好一张扑克牌对象后,我们需要52张扑克牌(为方便表示去掉大小王),有四种花色,每种花色13张牌.所以我们可以用一个数组来存放花色,再创建一个for循环遍历每一个花色,这样就可以把每张扑克牌的花色和数字组合在一起.由于之前已重写toString()方法,所以只要我们打印扑克牌对象就能得到所有组装好的扑克牌.

public class demo7_30{
  private static final String suits[] = {"♠","♥","♣","♦"};
    public static List<Card> buyCard(){//买扑克牌
        ArrayList<Card> cards = new ArrayList<>();
        for (int i = 0; i < suits.length; i++) {
            for (int j = 1; j <=13 ; j++) {
                cards.add(new Card(j,suits[i]));
            }
        }
        return cards;
    }
public static void main(String[] args) {//扑克牌
        List<Card> cards = buyCard();
        System.out.println("买扑克"+cards);
    }
}

 2)洗牌:

        为了使一副扑克牌达到随机的效果,我们洗牌时的主要思想就是用Random函数来实现扑克牌排列的随机性,但是Random(x)函数只能随机0-x的数字,我们很有可能抽到要交换的数字.为了解决这一问题,我们可以从后往前交换扑克牌,当i=13时,Random(i)只会随机到[0-13)的数字.有了随机数字和待交换数字之后我们就可以,实现一个swap()方法来交换数字.但此时要注意:我们的扑克牌以面向对象不在是一个简单的数组,所以要用集合的方法来获取并改变元素,获取元素用get()方法,改变元素用set(index,要改变的元素)方法.

 private static void swap(List<Card> cards,int ran,int i){//交换牌
        Card tmp = cards.get(i);
        cards.set(i,cards.get(ran));
        cards.set(ran,tmp);
    }
 public static List<Card> wash(List<Card> cards){//洗牌
        int size = cards.size();
        for (int i = size-1; i >0 ; i--) {
            Random random = new Random();
            int ran = random.nextInt(i);
            swap(cards,ran,i);
        }
        return cards;
    }
 public static void main(String[] args) {//扑克牌
        List<Card> cards1 = wash(cards);
        System.out.println("洗扑克"+cards1);
}

3)发牌:(四个人轮流发13张牌)

        我们可以把发牌器和每个人都看做是一个集合对象,只不过发牌器中存放的是每个人的集合,而每个人中存放的扑克牌的集合,那么我们就可以把发牌器抽象成一个二维数组,这样就可以通过发牌器的下标来访问到每一个人的扑克牌集合.发牌时,从扑克牌的集合中取出一张放入发牌器下标所对应的人即可.

 ArrayList<ArrayList<Card>> hand = new ArrayList<>();//二维数组
        ArrayList<Card> hand1 = new ArrayList<>();
        ArrayList<Card> hand2 = new ArrayList<>();
        ArrayList<Card> hand3 = new ArrayList<>();
        ArrayList<Card> hand4 = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        hand.add(hand4);
        for (int i = 0; i < 13; i++) {//14张牌
            for (int j = 0; j < 4; j++) {//4个人
                Card card = cards.remove(0);
                hand.get(j).add(card);
            }
        }
        System.out.println("第一个人的牌:"+hand1+"\t");
        System.out.println("第二个人的牌:"+hand2+"\t");
        System.out.println("第三个人的牌:"+hand3+"\t");
        System.out.println("第四个人的牌:"+hand4+"\t");
}

二.杨辉三角

        杨辉三角相信大家已经不陌生了,今天我们就从集合的角度来实现杨辉三角.首先定义 一个存放List集合的集合,其实本质就是二维数组 .我们将每一行的元素放入List集合中,再将准备好的List集合放入List的嵌套集合中,这样就可构成一个完整的杨辉三角.

public static void main(String[] args) {
        List<List<Integer>> ret = new ArrayList<>();
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);//第一行
        ret.add(list1);

        for (int i = 1; i < 5; i++) {
            List<Integer> prevRow = ret.get(i - 1);
            List<Integer> list = new ArrayList<>();
            list.add(1);//第一个元素
            for (int j = 1; j < i; j++) {
                int nums = prevRow.get(j) + prevRow.get(j - 1);
                list.add(nums);
            }
            list.add(1);//每一行的结尾
            ret.add(list);
        }
        for (int i = 0; i < 5; i++) {
            System.out.println(ret.get(i)+"\t");
        }
    }

三.删除第一个字符串中出现的第二个字符串的字符.(CETV面试题)

        这是一道非常经典的面试题,只要掌握ArrayList集合的应用,便可以很容易做出.我们只需要遍历第一个字符串,并检查是否出现第二个字符串中的字母,如果不出现就放入ArrayList集合当中即可.注意这道题不能使用数组,否则打印出的元素重复位置会带有null或者我们不需要的元素.这恰好体现了集合的优越性.

public static void main(String[] args) {
        //删除第一个字符串中出现的第二个字符串的字符CVTE面试题
        String str1 = "Welcome to cevt ";
        String str2 = "come";
        ArrayList<Character> List = new ArrayList<>();
        for (int i = 0; i < str1.length(); i++) {
            char ret = str1.charAt(i);
            if (!str2.contains(ret+"")){
                List.add(ret);
            }
        }
        for (char ret:List) {
            System.out.print(ret+"");
        }

    }


总结

        以上就是ArrayList集合应用的全部内容了,从ArrayList的底层构造原理实现到熟练掌握并应用,标着着我们对集合的学习已经迈入了一大步,后续还会陆续更新栈,队列,二叉树等内容.如果我的文章对你有亿点点帮助和启发,麻烦不要忘记三连哦!

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Node_Hao

您的支持是我创作的不懈动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值