【数据结构】ArrayList的简单使用

news2024/12/23 6:39:40

文章目录

  • ArrayList
    • 一些ArrayList常用的方法
  • 杨辉三角
  • 打扑克时的洗牌与摸牌

ArrayList

上一次我们自己模拟实现了一下数据结构中的顺序表,当然在我们日常使用时不需要每次使用都自己模拟实现一遍,Java中提供了ArrayList类,我们直接导包就可以使用。

 public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();//创建一个空表
        List<String> list2 = new ArrayList<>(10);//指定表的初始容量

        list1.add(1);
        list1.add(2);
        list1.add(3);
        list2.add("a");
        list2.add("b");
        list2.add("c");

        //打印顺序表
        for(int i = 0;i < list1.size();i++) {
            System.out.print(list1.get(i) + " ");
        }
        System.out.println();
        for (String str:list2) {
            System.out.print(str + " ");
        }

    }

我们可以实例化ArrayList对象,通过对象调用方法来操作顺序表。例如上面这段代码我们就实例化了两个顺序表,通过调用add()方法想顺序表中添加元素最后通过for循环遍历打印顺序表。ArrayList最长使用的遍历方式是:for循环+下标 以及 foreach
在这里插入图片描述

一些ArrayList常用的方法

方法功能
boolean add(E e)尾插 e
void add(int index, E element)将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的元素
E remove(int index)删除 index 位置元素
boolean remove(Object o)删除遇到的第一个 o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在下标
int lastIndexOf(Object o)返回最后一个 o 的下标
List<E> subList(int fromIndex, int toIndex)截取部分List=

杨辉三角

杨辉三角,这是一道leetcode上面的练习题,在了解上面的知识之后大家可以尝试做一做,我们需要通过顺序表实现杨辉三角。
在这里插入图片描述

class Solution {
    public List<List<Integer>> generate(int numRows) {

    }
}

这是题目已经给出的代码,有的老铁就要昏倒了,题目差一点就没看懂,List<List<Integer>>这个返回值是什么嗄?顺序表套顺序表?但当我们联想到顺序表底层是由数组实现的时候我们就知道,其实这就相当于一个二维数组。他的大概结构通过画图可以表示为:

在这里插入图片描述

    public static  List<List<Integer>> generate(int numRows) {
        List<List<Integer>> triangle = new ArrayList<>();
        List<Integer> row = new ArrayList<>();
        row.add(1);
        triangle.add(row);

        for(int i = 1;i < numRows;i++) {
            List<Integer> prevRow = triangle.get(i - 1);
            List<Integer> curRow = new ArrayList<>();
            curRow.add(1);
            for(int j = 1;j < i ;j++) {
                curRow.add(prevRow.get(j) + prevRow.get(j - 1));
            }
            curRow.add(1);
            triangle.add(curRow);
        }

        return triangle;
    }

因为我们需要有这样一个顺序表存储杨辉三角,所以 List<List<Integer>> triangle = new ArrayList<>();我们实例化这样一个顺序表,通过观察我们发现,无论什么样的杨辉三角,第一行总是1,所以我们创建一行 List<Integer> row = new ArrayList<>();并且将这行的元素添加为1,并且将这一行添加到triangle。之后我们再次观察发现,之后的每一行都是第一个元素为1,最后一个元素为1,剩下的元素等于上一行本列上的元素加上前一列上的元素。我们每次都是对一行操作完成后将这一行添加到triangle中。大致思路就是这样大家可以通过这道题,练习ArrayList的用法。

打扑克时的洗牌与摸牌

可以自主完成杨辉三角后我们可以尝试写一个有趣的小东西,打扑克相信大家都打过,我们现在可以用顺序表简单实现一下洗牌摸牌的过程。
既然要打牌那么我们就需要有牌这个类吧,牌都有点数和花色。

package demo1;

public class Card {
    public int rank;
    public String suit;

    @Override
    public String toString() {
        return String.format("[%s,%d]",suit,rank);
    }
}

牌有了,当我们开始打牌时需要有一副扑克牌吧:

package demo1;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class CardGame {

    private static String[] SUITS = new String[]{"♠","♥","♣","♦"};

    //打扑克需要买一副扑克
    public static List<Card> BuyCard() {
        List<Card> deck = new ArrayList<>(52);

        for(int i = 0;i < 4;i++) {
            for(int j = 1;j <=13;j++) {
                Card card = new Card();
                card.suit = SUITS[i];
                card.rank = j;
                deck.add(card);
            }
        }

        return deck;
    }
}

我们将52张牌(去除大小王)储存在一个顺序表中,这个顺序表中的元素类型就是Card,给每一张牌添加花色和点数后放入顺序表,每种花色有13个点数,完成4次循环后,52张牌的顺序表就构建完成了。

 //洗牌
    public void shuffle(List<Card> deck) {
        Random random = new Random(20221226);
        for(int i = deck.size() -1 ;i > 0;i--) {
            int r = random.nextInt(i);
            swap(deck,i,r);
        }
    }

    //交换
    private void swap(List<Card> deck,int i,int j) {
        Card tmp = deck.get(i);
        deck.set(i,deck.get(j));
        deck.set(j,tmp);
    }

上面是洗牌的方法,我们通过随机数,从后往前遍历,交换对应位置的元素与对应位置下标生成的随机数的位置的元素(Card),就实现我们的洗牌功能。

package demo1;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {

        List<Card> deck = new ArrayList<>();
        CardGame cardGame = new CardGame();
        deck = cardGame.BuyCard();
        System.out.println("洗牌前:");
        System.out.println(deck);
        cardGame.shuffle(deck);
        System.out.println("洗牌后:");
        System.out.println(deck);


        //三个人抓牌每个人抓五张
        List<List<Card>> hands = new ArrayList<>();
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());

        for(int i = 0;i < 5;i++) {
            for(int j = 0;j < 3;j++) {
                hands.get(j).add(deck.remove(0));
            }
        }

        //打印一下三个人的牌
        System.out.println("A的牌:");
        System.out.println(hands.get(0));
        System.out.println("B的牌:");
        System.out.println(hands.get(1));
        System.out.println("C的牌:");
        System.out.println(hands.get(2));
        System.out.println("剩余的牌:");
        System.out.println(deck);

    }
}

这是模拟三个摸牌,每个人5张牌,这里摸牌的思路跟上面杨辉三角的思路有一点点像,也是一个二维数组的思路。大家可以自己看看尝试这写一下。最后运行的效果为:
在这里插入图片描述
当然我们这里就只写了洗牌和摸牌,大家有兴趣还可以自己补充一下游戏主题的内容。以上就是关于顺序表ArrayList的简单使用的介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 Delphi / Lazarus / C++ Builder 从 FastReport VCL 创建 Code 11 条码?

Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.VCL官方版下载https://www.evget.com/…

黑客动态播报 | 这种勒索方式,让付赎金毫无用处

入侵→加密→要赎金 黑客凭这套商业模式横行多年 受害者之所以前赴后继付赎金 是因为他们相信 给钱就能如愿拿到密钥 尽快恢复业务 可有的时候 自系统被加密的那一刻起 数据就拿不回来了 今年10月,网上出现了一种名为Cryptonite的开源勒索软件包。它使用Python编码,利…

SpringBoot 整合 Shiro 实现动态权限加载更新+ Session 共享 + 单点登录

一.说明 二.项目环境 二.编写项目基础类 三.编写Shiro核心类 四.实现权限控制 五.POSTMAN测试 六.项目源码 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shiro没有SpringSecurity功能更丰富,但是它轻量,简单,在项目中通常业务…

报表设计-FineReport 配置MySQL5外接数据库

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 - 11.0.3 1&#xff09;首次配置外接数据库时&#xff0c;支持自行选择是否「迁移数据至要启用的数据库」 2&#xff09;迁移外接数据库的过程提示细化&#xff0c;方便用户了解迁移进度 1.2 功能简介 报表系统配置外接数…

推荐系统遇上深度学习(一四一)-[快手]移动端实时短视频推荐

今天给大家带来CIKM2022应用研究方向最佳论文-来自于快手团队的《Real-time Short Video Recommendation on Mobile Devices》&#xff0c;主要研究在移动端如何做到更好的短视频实时推荐&#xff0c;是一篇不错的落地经验分享的论文&#xff0c;一起来看一下。1、背景近几年来…

LeetCode 323周赛

2500. 删除每行中的最大值 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果存在多个这样的值&#xff0c;删除其中任何一个。将删除元素中的最大值与答案相加。 …

【Leetcode】101. 对称二叉树、104. 二叉树的最大深度、226. 翻转二叉树

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 101. 对称二叉树 104. 二叉树的最大深度 226. 翻转二叉树 101. 对称二…

DJ11 8086系列处理器(第一节课)

目录 一、8086/8088微处理器 二、8086/8088CPU的特点 1. 指令流水线 2. 内存分段管理 3. 支持多处理器系统 三、8088 CPU外部引脚及功能 1. 最小模式下的引脚 2. 最大模式下的引脚 四、8088/8086 CPU 的工作时序 1. 基本概念 2. 总线周期 一、8086/8088微处理器 二、…

软考中级系统集成项目管理工程师怎么自学备考

1、考试内容是什么&#xff1f; 2、备考前要准备什么&#xff1f; 3、如何高效备考&#xff1f; 一、考试内容是什么&#xff1f; 本考试设置的科目包括&#xff1a; &#xff08;1&#xff09;系统集成项目管理基础知识&#xff0c;考试时间为150分钟&#xff0c;笔试&am…

IB体育评估哪些内容?

"IB体育"这个词的内涵太广了&#xff0c;覆盖的课程也很多&#xff01;这个IB体育是一般体育课还是某个具体的IB科目呢&#xff1f;是MYP阶段的体育还是DP阶段的呢&#xff1f;其实很多人都是很懵&#xff0c;通过收集资料&#xff0c;可以分享一下&#xff0c;仅供参…

2022年虚拟电厂行业研究报

第一章 行业概况 虚拟电厂&#xff08;VPP, Virtual Power Plant&#xff09;本质上是将分布式电源&#xff08;发电&#xff09;、可控负荷&#xff08;用电&#xff09;、储能等利用计算机通信网络技术将其聚合成一个虚拟的集中式电厂&#xff0c;来为电网提供需求侧响应的“…

4个封神的电脑工具,颠覆你对免费白嫖的认知,干货奉上

闲话少说&#xff0c;直上干货。 1、TinyWow TinyWow虽说是国外网站工具&#xff0c;但不得不承认真的无敌好用&#xff0c;收纳工具超200个&#xff0c;完全免费&#xff0c;无任何弹屏广告&#xff0c;更为良心的是&#xff0c;不需要注册登录&#xff0c;随用随走&#xff0…

专业的方案公司阐述智能硬件产品开发的全过程

现在市场上的方案公司太多&#xff0c;让人应接不暇&#xff0c;当我们要开发一款智能硬件产品的时候&#xff0c;我们要如何去选择方案公司呢&#xff1f;又怎样判断方案公司是否则专业呢&#xff1f;下面沐渥带大家一起来了解下智能硬件产品开发的全过程&#xff0c;大家就知…

Ubuntu 18.0.4 SonarQube-7.1.x 安装教程 以及错误总结

Ubuntu 18.0.4 SonarQube-7.1.x 安装教程 docker安装未成功 zip安装 1. 下载地址 sonarQube最新版下载地址&#xff1a;&#xff08;最新版不支持mysql&#xff09;https://www.sonarqube.org/downloads/7.1版本下载地址&#xff1a;​ ​https://binaries.sonarsource.com…

【UE4 第一人称射击游戏】10-添加冲刺功能

上一篇&#xff1a; 【UE4 第一人称射击游戏】09-添加蹲伏功能 本篇效果&#xff1a; 步骤&#xff1a; 1.在“Character”文件夹内添加一个混合空间 骨架选择“Swat_Skeleton” 命名为“Sprint_BS” 双击打开“Sprint_BS”&#xff0c;将水平和垂直坐标名称分别设为“Direct…

【java】HashMap底层原理实现原理及面试题

目录一.哈希表(散列)1.什么是哈希表2.什么是哈希冲突(面试题)3.解决哈希冲突的方法(面试题)(1) 开放地址法① 线性探查②二次探查③随机探查(2) 再哈希法(3) 链地址法(4)建立公共溢出区二.HashMap1.HashMap的hash()算法(面试)(1)为什么不是h key.hashCode()直接返回&#xff0…

绘制菜单符号的技法

在上一篇文章中&#xff0c;我们了解了如何绘制主题化的和原始未主题化的单选按钮&#xff0c;我曾提到&#xff0c;绘制菜单符号会更加复杂一些。复杂之处在于&#xff0c;这些符号是通过单色位图实现的&#xff0c;而不是漂亮的全彩色位图。 首先&#xff0c;我们将通过一种错…

linux内核调度子系统随笔(一)

调度子系统组件(1) 调度类用于判断接下来运行哪个进程&#xff0c;内核支持不同的调度策略(完全公平调度,实时调度)&#xff1b;调度类使得能够以模块化方法实现这些策略; (2) 在选中将要选择的进程后&#xff0c;必须执行底层任务切换&#xff1b;需要与cpu的紧密交互&#x…

信息安全管理体系

环境迁移 Platfor m Ops for AI 作为整合了 DataOps、MLOps、ModelOps 的复杂技术平台&#xff0c;在项目开发时仅使用一套系统无法支撑平台的稳定搭建&#xff0c;往往需要开发系统、集成测试系统、正式 环境系统在项目生命周期 中协作配合。将表、索引、并发程序、配置内容等…

HTML5 新增属性

文章目录HTML5 新增属性公共属性hidden属性draggable属性contenteditable属性data-*属性input元素新增属性autocomplete属性autofocus属性placeholder属性required属性pattern属性form元素新增属性novalidate属性HTML5 新增属性 公共属性 HTML5新增的常见公共属性有4个&#…