ArrayList的具体使用

news/2024/10/11 23:27:08 标签: java, 前端, 开发语言

本节目标:

1.简单的洗牌算法

2.杨辉三角形例题

3.消除字符串中特定字母问题

一.简单的洗牌算法

        一开始先列一下我们的需求。洗牌算法需要先有牌,第二步进行洗牌,第三步发牌,并且将剩余牌打印,第四步可以让牌排个序

        第一步.生成牌

        众所周知,牌是由4个图标组成,分别为"", "", "", ""

        还有13个数字组成,A,2,3,4,5,6,7,8,9,10,J、Q、K

        我们把它们都算为1-13的数字

        先生成牌这个类

测试我们的生成牌方法

     第二步.洗牌

思路:洗牌的逻辑就是交换,遍历一遍该顺序表,用随机数与之交换从而实现洗牌的目的

测试结果

可见确实实现了打乱牌的步骤

第三步.发牌

三个人,每人随机拿五张牌,逻辑为每个人都抽取第一张牌,满足了随机抽牌的要求,比较洗过的牌本身就满足随机。

测试

明显能发现。发完牌后,总牌数减少了

可见是成功的

第四步.排序

排序用到的是Comparator(比较器)来进行比较

定义一个比较的方法

 在顺序表内部有一个Collections接口,有内置的比较方法

Collections.sort有函数的重载,除了可以直接放顺序表以外,也可以在后面放一个自定义比较器类型

比如这里我写了一个比较器类

比较的是卡牌的数字,通过数字大小进行排序

再拿到主函数内部进行测试

测试后的结果证明了我的方法是可以的

简单的洗牌算法完毕。

此处,我将所有的代码放过来

第五步.总代码

Card.java

java">public class Card {
    public String suit;
    public  int rank;

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

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "{"+suit+" "+rank+"}";
    }
}

Cards.java

java">import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Random;

public class Cards{
    public final String suits[]={"♠", "♥", "♣", "♦"};
    public ArrayList<Card> buyCards(){//洗牌前应该先出创建52张扑克牌
        ArrayList<Card> arrayList=new ArrayList<>();//用顺序表存储这一张张的牌,数据类型为Card类类型
        for(int i=0;i<suits.length;i++){
             for(int j=1;j<=13;j++){
                 Card card=new  Card(suits[i],j);
                 arrayList.add(card);//arrayList.add插入牌
             }
         }
        return arrayList;//返回个顺序表
     }
     public void Shuffle(ArrayList<Card> arrayList){//洗牌的方法
         Random random=new Random();
         for(int i=arrayList.size()-1;i>0;i--){
             int ret =random.nextInt(i);
             swap(arrayList,i,ret);//交换
         }
     }
     private void swap(ArrayList<Card> arrayList,int pos,int ret){
        Card card=arrayList.get(pos);//临时变量存储pos
        arrayList.set(pos,arrayList.get(ret));//将ret位置的给pos位置
         arrayList.set(ret,card);
     }

     public void drawCard(ArrayList<Card> arrayList){//牌的分发
        ArrayList<Card> arrayList1=new ArrayList<>();//三个空顺序表
        ArrayList<Card> arrayList2=new ArrayList<>();
        ArrayList<Card> arrayList3=new ArrayList<>();;
        ArrayList<ArrayList<Card>> list =new ArrayList<>();//一个二维数组
        list.add(arrayList1);
        list.add(arrayList2);
        list.add(arrayList3);
        for(int i=0;i<5;i++){
            for(int j=0;j<list.size();j++){
                Card card=arrayList.remove(0);
                list.get(j).add(card);
            }
        }
         System.out.println("第一个人得到的牌为:"+arrayList1);
         System.out.println("第二个人得到的牌为:"+arrayList2);
         System.out.println("第三个人得到的牌为:"+arrayList3);

     }
     public void sortCard(ArrayList<Card> arrayList){//牌的排序
    RankComparator rankComparator=new RankComparator();
         Collections.sort(arrayList,rankComparator);//Collection的比较方法,比较内部数字的大小
     }

}

RankComparator.java

java">import java.util.Comparator;

public class RankComparator implements Comparator<Card> {//Comparator后面的泛型写要比较的类型,这里需要比较的是Card类型

    @Override
    public int compare(Card o1, Card o2) {//使用比较器,进行比较,传入两个Card类
        return o1.getRank()-o2.getRank();//前者减去后者是正序排序,后者减去前者是逆序排序
        //使用card.getRank可以获取需要比较的数字 ,需要在Card里面自己定义get方法
    }
}

test.java

java">import java.util.ArrayList;

public class test {
    public static void main(String[] args) {
       Cards Cards=new Cards();
       ArrayList<Card> list=Cards.buyCards();
        System.out.println("交换后的牌为:");
        System.out.println(list);
        Cards.drawCard(list);
        System.out.println("剩余的牌为:");
        System.out.println(list);
        System.out.print("比较后的卡牌为:");
        Cards.sortCard(list);
        System.out.println(list);
    }
}

二.杨辉三角形例题

118. 杨辉三角 - 力扣(LeetCode)

这是例题链接

思路:第一行固定是1,除了第一行。第一个数字和最后一个数字也都是1

中间的数字存在的规律,假设求a[i][j]的数是什么

a[i][j]=a[i-1][j-1]+a[i-1]+[j];

用二维数组来表示即可

代码:

java">class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret=new ArrayList();
        List<Integer> list=new ArrayList();
        list.add(1);
        ret.add(list);
      for(int i=1;i<numRows;i++){
        List<Integer> temp=new ArrayList();
        temp.add(1);
        for(int j=1;j<i;j++){
        temp.add(ret.get(i-1).get(j-1)+ret.get(i-1).get(j));
        }
        temp.add(1);
        ret.add(temp);
      }
        return ret;
    }
}

三.消除字符串中特定字母问题

给你两个字符串

str1="welcome to bit"

str2="come"

要求:删除str1中的所有包含str2的字母

例题:上面的结果为"wl t bit"

解法一:

空间复杂度为O(n²)

效率特别低

两个字符串存进两个数组里,再一个一个比较,相同的就前移

解法二:

创建数组,使用字符串contains方法,虽然要求的是字符串,我们可以ch+""方法来转变为字符串

如果不同就放进数组

解法三:

字符串拼接的方法,使用StringBuilder


http://www.niftyadmin.cn/n/5687858.html

相关文章

嵌入式 ADC基础知识

在现实世界中&#xff0c;常见的信号大都是模拟量&#xff0c;像温度、声音、气压等&#xff0c;但在信号的处理与传输中&#xff0c;为了减少噪声的干扰&#xff0c;较多使用的是数字量。因此我们经常会将现实中的模拟信号&#xff0c;通过 ADC 转换为数字信号进行运算、传输、…

9--苍穹外卖-SpringBoot项目中Redis的介绍及其使用实例 详解

目录 Redis入门 Redis简介 Redis服务启动与停止 服务启动命令 Redis数据类型 5种常用数据类型介绍 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis Redis的Java客户端 …

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络&#xff0c;若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

【Kubernetes】常见面试题汇总(四十九)

目录 110.假设一家公司希望通过采用新技术来优化其工作负载的分配。公司如何有效地实现这种资源分配&#xff1f; 111.考虑一家拼车公司希望通过同时扩展其平台来增加服务器数量。您认为公司将如何处理服务器及其安装&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【…

线程池面试集

目录 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优雅的停止一个线程? 线程池的核心线程数、最大线程数该如何设置? 如何理解Java并发中的可见性、原子性、有序性? Java死锁如何避免? 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优…

【Python】Flask-Admin:构建强大、灵活的后台管理界面

在 Web 应用开发中&#xff0c;构建一个直观且功能丰富的后台管理系统对于处理数据和维护应用至关重要。虽然构建一个完全自定义的管理后台界面非常耗时&#xff0c;但 Flask-Admin 提供了一个简洁、灵活的解决方案&#xff0c;可以让开发者快速集成一个功能齐全的后台管理系统…

李宏毅机器学习2022-HW8-Anomaly Detection

文章目录 TaskBaselineReportQuestion2 Code Link Task 异常检测Anomaly Detection 将data经过Encoder&#xff0c;在经过Decoder&#xff0c;根据输入和输出的差距来判断异常图像。training data是100000张人脸照片&#xff0c;testing data有大约10000张跟training data相同…

Ceph RocksDB 深度调优

介绍 调优 Ceph 可能是一项艰巨的挑战。在 Ceph、RocksDB 和 Linux 内核之间&#xff0c;实际上有数以千计的选项可以进行调整以提高存储性能和效率。由于涉及的复杂性&#xff0c;比较优的配置通常分散在博客文章或邮件列表中&#xff0c;但是往往都没有说明这些设置的实际作…