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


    目录

    前言

    一.扑克牌发牌器

    1)购买扑克牌:

     2)洗牌:

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

    二.杨辉三角

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

    总结



    前言

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


    一.扑克牌发牌器

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

            1.购买扑克牌.

            2.打乱扑克牌的顺序.

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

    1)购买扑克牌:

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

    1. class Card {
    2. private int rank;
    3. private String suit;
    4. public Card(int rank, String suit) {
    5. this.rank = rank;
    6. this.suit = suit;
    7. }
    8. @Override
    9. public String toString() {
    10. return "[" + this.suit + " " + this.rank + "]";
    11. }
    12. }

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

    1. public class demo7_30{
    2. private static final String suits[] = {"♠","♥","♣","♦"};
    3. public static List buyCard(){//买扑克牌
    4. ArrayList cards = new ArrayList<>();
    5. for (int i = 0; i < suits.length; i++) {
    6. for (int j = 1; j <=13 ; j++) {
    7. cards.add(new Card(j,suits[i]));
    8. }
    9. }
    10. return cards;
    11. }
    12. public static void main(String[] args) {//扑克牌
    13. List cards = buyCard();
    14. System.out.println("买扑克"+cards);
    15. }
    16. }

     2)洗牌:

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

    1. private static void swap(List cards,int ran,int i){//交换牌
    2. Card tmp = cards.get(i);
    3. cards.set(i,cards.get(ran));
    4. cards.set(ran,tmp);
    5. }
    6. public static List wash(List cards){//洗牌
    7. int size = cards.size();
    8. for (int i = size-1; i >0 ; i--) {
    9. Random random = new Random();
    10. int ran = random.nextInt(i);
    11. swap(cards,ran,i);
    12. }
    13. return cards;
    14. }
    15. public static void main(String[] args) {//扑克牌
    16. List cards1 = wash(cards);
    17. System.out.println("洗扑克"+cards1);
    18. }

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

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

    1. ArrayList> hand = new ArrayList<>();//二维数组
    2. ArrayList hand1 = new ArrayList<>();
    3. ArrayList hand2 = new ArrayList<>();
    4. ArrayList hand3 = new ArrayList<>();
    5. ArrayList hand4 = new ArrayList<>();
    6. hand.add(hand1);
    7. hand.add(hand2);
    8. hand.add(hand3);
    9. hand.add(hand4);
    10. for (int i = 0; i < 13; i++) {//14张牌
    11. for (int j = 0; j < 4; j++) {//4个人
    12. Card card = cards.remove(0);
    13. hand.get(j).add(card);
    14. }
    15. }
    16. System.out.println("第一个人的牌:"+hand1+"\t");
    17. System.out.println("第二个人的牌:"+hand2+"\t");
    18. System.out.println("第三个人的牌:"+hand3+"\t");
    19. System.out.println("第四个人的牌:"+hand4+"\t");
    20. }

    二.杨辉三角

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

    1. public static void main(String[] args) {
    2. List> ret = new ArrayList<>();
    3. List list1 = new ArrayList<>();
    4. list1.add(1);//第一行
    5. ret.add(list1);
    6. for (int i = 1; i < 5; i++) {
    7. List prevRow = ret.get(i - 1);
    8. List list = new ArrayList<>();
    9. list.add(1);//第一个元素
    10. for (int j = 1; j < i; j++) {
    11. int nums = prevRow.get(j) + prevRow.get(j - 1);
    12. list.add(nums);
    13. }
    14. list.add(1);//每一行的结尾
    15. ret.add(list);
    16. }
    17. for (int i = 0; i < 5; i++) {
    18. System.out.println(ret.get(i)+"\t");
    19. }
    20. }

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

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

    1. public static void main(String[] args) {
    2. //删除第一个字符串中出现的第二个字符串的字符CVTE面试题
    3. String str1 = "Welcome to cevt ";
    4. String str2 = "come";
    5. ArrayList List = new ArrayList<>();
    6. for (int i = 0; i < str1.length(); i++) {
    7. char ret = str1.charAt(i);
    8. if (!str2.contains(ret+"")){
    9. List.add(ret);
    10. }
    11. }
    12. for (char ret:List) {
    13. System.out.print(ret+"");
    14. }
    15. }

     


    总结

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

  • 相关阅读:
    AVL平衡树的插入
    JavaScript重点知识总结一
    使用 GRPC C++ API连接Java的RPC服务
    Mac中使用virtualenv和virtualenvwrapper
    《第一堂棒球课》:王牌一垒手·棒球3号位
    手把手改进yolo训练自己的数据(坑洼路面识别)
    【4】c++设计模式——>UML表示类之间的聚合关系
    力扣题目训练(18)
    sql 常用命令-----增删查改
    Java Pattern类简介说明
  • 原文地址:https://blog.csdn.net/liu_xuixui/article/details/126077050