数据结构-ArrayList

目录

线性表

顺序表

ArrayList

ArrayList的使用

ArrayList的构造方法

ArrayList的常用方法

ArrayList的遍历

实现简单的ArrayList

洗牌算法

删除公共字符串问题

杨辉三角


线性表

线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构.常见的线性表有顺序表,链表,栈和队列等等.

线性表在逻辑上是线性结构,也就是说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储的时候,通常是以数组和链式结构的形式存储.

顺序表

顺序表是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下用数组存储.在数组上完成数据的增删查改.

ArrayList

在集合框架中,ArrayList是一个普通的类,实现了List接口.

1. ArrayList 实现了 RandomAccess 接口,表明 ArrayList 支持随机访问
2. ArrayList 实现了 Cloneable 接口,表明 ArrayList 是可以 clone
3. ArrayList 实现了 Serializable 接口,表明 ArrayList 是支持序列化的
4. Vector 不同, ArrayList 不是线程安全的,在单线程下可以使用,在多线程中可以选择 Vector或者 CopyOnWriteArrayList
5. ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

ArrayList的使用

ArrayList的构造方法

 第二种构造方法,实现了collection接口的都可以传进来.但是需要注意的是E是泛型通配符的上界,只有类型相同是E或者是E的子类的时候,才可以传进来.

当我们调用不带参数的构造方法的时候,只有第一个add的时候,我们才会为其分配大小为10的内存.

扩容是采用1.5倍的扩容方式.如果用户所需大小超过预估的1.5倍大小,则按照用户所需大小进行扩容,并且在真正的扩容之前会检测能否扩容成功,防止太大导致扩容失败.扩容是采用copyOf进行扩容.


ArrayList的常用方法

subList方法需要注意的是:截取的部分并没有创建新的顺序表,而是新的引用(截取的部分)还是指向了原来的顺序表.所以修改截取部分的内容就是将原来顺序表的内容给修改了.

对于remove需要注意的是,编译器会将我们传入的int类型的值统一认定为是下标而不是实际内容的值.

比如有一个ArrayList:[1,7]两个元素.

public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(7);System.out.println(arrayList);//我们要删除值为7的元素//arrayList.remove(7);//编译器会把7当成下标,而不是实际的值,所以我们执行起来会报越界错.//正确的做法是传入一个引用类型arrayList.remove(new Integer(7));
}

ArrayList的遍历

ArrayList的遍历有三种:for循环+下标的方式,foreach,和迭代器.

public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);//for循环+下标for (int i = 0; i < arrayList.size(); i++) {System.out.printf(arrayList.get(i)+" ");}System.out.println();//foreachfor (int x:arrayList) {System.out.printf(x+" ");}System.out.println();//使用迭代器//必须实现了Iterable接口Iterator<Integer> it = arrayList.iterator();while (it.hasNext()){//it指向上一个数据//it.next()会使it访问下一个元素并且向下走一步System.out.printf(it.next()+" ");}System.out.println();
}

实现简单的ArrayList

import java.util.Arrays;public class MyArrayList {public int[] elem;//数组public int usedSize;//记录有效的数据的个数public static final int DEFAULT_SIZE = 10;public MyArrayList(){this.elem = new int[DEFAULT_SIZE];}// 打印顺序表public void display() {for (int i = 0;i < this.usedSize; i++){System.out.print(this.elem[i]+" ");}System.out.println();}// 新增元素,默认在数组最后新增public void add(int data) {//1.检查当前的顺序表是不是满了if (isFull()){//2.如果满了就要扩容this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}//3.this.elem[usedSize] = data;//4.usedSize++;}public boolean isFull(){if (this.usedSize > elem.length){return true;}return false;}// 在 pos 位置新增元素//负数下标不可以//越过数组的长度不可以//不能隔着元素放public void add(int pos, int data) throws PosWrongfulException {if (isFull()){System.out.println("满了!");this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}if (pos < 0 || pos > this.usedSize){System.out.println("pos的位置不合法!");throw new PosWrongfulException("Pos位置不合法!");}//pos一定是合法的//1.开始挪动数据for (int i = this.usedSize-1; i >= pos; i--) {this.elem[i+1] = this.elem[i];}//2.插入数据this.elem[pos] = data;//3.usedSize++usedSize++;}// 判定是否包含某个元素public boolean contains(int toFind) {for (int i = 0; i < this.usedSize; i++) {if (elem[i] == toFind){return true;}}return false;}// 查找某个元素对应的位置public int indexOf(int toFind) {for (int i = 0; i < this.usedSize; i++) {if (this.elem[i] == toFind){return i;}}return -1;}// 获取 pos 位置的元素public int get(int pos) {//判空if (isEmpty()){throw new EmptyException("当前顺序表为空!");}//判断pos位置的合法性if (pos < 0 || pos >= this.usedSize){throw new PosWrongfulException("get获取元素的时候,Pos位置不合法!");}return this.elem[pos];}//判空public boolean isEmpty(){return size() == 0;}// 给 pos 位置的元素更新为 valuepublic void set(int pos, int value) {//判空if (isEmpty()){throw new EmptyException("当前顺序表为空!");}//判断pos位置的合法性if (pos < 0 || pos >= this.usedSize){throw new PosWrongfulException("pos位置不合法!");}this.elem[pos] = value;}//删除第一次出现的关键字keypublic void remove(int key) {if (isEmpty()){throw new EmptyException("顺序表为空!");}int index = this.indexOf(key);if (index == -1){System.out.println("没有这个数字!");return;}// 9 3 4 8 6// 0 1 2 3 4//usedSize==5,i<4,i最大到3//index==4的情况下直接不走循环,usedSize--即可.for (int i = index; i <size()-1 ; i++) {this.elem[i] = this.elem[i+1];}usedSize--;}// 获取顺序表长度public int size() { return this.usedSize; }// 清空顺序表public void clear() {this.usedSize = 0;}}

洗牌算法

使用ArrayList实现三个人轮流摸牌的过程.

1.先买一副扑克牌,四种花色,每种花色13张.

2.洗牌

3.揭牌,每人按序摸一张,总共摸五轮.

public class Poker {//花色private String suit;//数值private int rank;public Poker(String suit, int rank) {this.suit = suit;this.rank = rank;}public void setSuit(String suit) {this.suit = suit;}public void setRank(int rank) {this.rank = rank;}public String getSuit() {return suit;}public int getRank() {return rank;}@Overridepublic String toString() {return "["+"suit= " + suit + ", rank=" + rank +"]";}
}
import java.util.ArrayList;
import java.util.List;
import java.util.Random;//1.买一副扑克牌
//2.洗牌
//3.三个人轮流揭牌,每个人揭5次
public class Pokers {public static final String[] SUITS = {"♥","♠","♣","♦"};/***买一副扑克牌*/public static List<Poker> bugPokers(){List<Poker> pokerList = new ArrayList<>();for (int i = 0; i < 4; i++) {for (int j = 0; j < 13; j++) {String suit = SUITS[i];int rank = j;Poker poker = new Poker(suit,rank);pokerList.add(poker);}}return pokerList;}//洗牌public static void shuffle(List<Poker> list){Random random = new Random();for (int i = list.size()-1; i > 0 ; i--) {int index = random.nextInt(i);swap(list,i,index);}}private static void swap(List<Poker> list, int i, int index) {Poker tmp = list.get(i);list.set(i,list.get(index));list.set(index,tmp);}public static void main(String[] args) {List<Poker> list = bugPokers();System.out.println("买牌:"+list);//洗牌shuffle(list);System.out.println("洗牌:"+list);//揭牌 3个人 每个人轮流抓五张牌//1.如何描述3个人List<Poker> hand1 = new ArrayList<>();List<Poker> hand2 = new ArrayList<>();List<Poker> hand3 = new ArrayList<>();//2.如何区分往哪个人手里送牌List<List<Poker>> hand = new ArrayList<>();hand.add(hand1);hand.add(hand2);hand.add(hand3);for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {List<Poker> handTmp = hand.get(j);handTmp.add(list.remove(0));}}for (int i = 0; i < hand.size(); i++) {System.out.println("第"+(i+1)+"个人的牌是:"+hand.get(i));}System.out.println("剩余的牌是: "+ list);}
}

删除公共字符串问题

//删除第一个字符串当中出现的第二个字符串中的字符,使用集合
//str1:welcome to bit
//str2:come
//输出wel t bit
//需要注意的是contains方法传的是一个字符串,字符+""就是将字符传为字符串,也可以字符包装类的toString方法将一个字符转为字符串
public static void main(String[] args) {String s1 = "welcome to bit";String s2 = "come";ArrayList<Character> arrayList = new ArrayList<>();for (int i = 0; i < s1.length(); i++) {if (!s2.contains(s1.charAt(i)+"")){arrayList.add(s1.charAt(i));}}for (Character a:arrayList) {System.out.printf(a.toString());}
}

杨辉三角

public List<List<Integer>> generate(int numRows) {List<List<Integer>> ret = new ArrayList<>();List<Integer> list1 = new ArrayList<>();list1.add(1);ret.add(list1);for (int i = 1; i <numRows ; i++) {//当前行List<Integer> curRow = new ArrayList<>();curRow.add(1);//一行中开始的1//前一行List<Integer> prevRow = ret.get(i-1);//中间位置需要计算for (int j = 1; j < i; j++) {int num = prevRow.get(j)+prevRow.get(j-1);curRow.add(j,num);}curRow.add(1);//一行中最后的那个1ret.add(curRow);}return ret;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubectl详解之声明式管理方法

目录 一、声明式管理方法二、资源配置清单的管理2.1 查看资源配置清单2.1 修改资源配置清单并应用2.1.1 离线修改2.1.2 在线修改 一、声明式管理方法 适合于对资源的修改操作 声明式资源管理方法依赖于资源配置清单文件对资源进行管理 资源配置清单文件有两种格式&#xff1a;…

部署LVS-DR群集

目录 1、LVS-DR数据包流向分析 2、LVS-DR中ARP问题 3、LVS-DR特性 LVS-DR的优缺点 1、LVS-DR数据包流向分析 (1)客户端发送请求到 Director Server (负载均器)&#xff0c;请求的数据报文(源 IP 是CIP&#xff0c;目标 IP 是 VIP) 到达内核空间。 (2) Director Server 利 …

SpringBoot使用EasyExcel批量导出500万数据

SpringBoot使用EasyExcel批量导出500万数据 说明excel版本比较EasyExcel介绍项目目录mysql对应表建表语句pom.xmlapplication.yml配置类启动类代码OrderInfo 实体类OrderInfoExcel excel模版标题类(EasyExcel需要使用这个)TestController控制层接口层TestServiceTestServiceImp…

行为型模式-策略模式(一)

今天就说一说设计模式中的策略模式&#xff0c;从名字来讲&#xff0c;意思就是&#xff0c;对应不同的情况&#xff0c;就有一种解决问题的办法&#xff0c;不同的情况&#xff0c;就有不同的应对方法&#xff0c;这就是策略模式&#xff0c;非常的智能化。 也可以参考菜鸟 …

阿里云服务器扩容记录

先在控制台选择云盘扩容&#xff0c;然后才能在服务器操作&#xff1a; blkidlsblk -n df -Thapt-get updatetype growpart || apt-get install -y cloud-guest-utilstype sgdisk || apt-get install -y gdiskLC_ALLen_US.UTF-8 growpart /dev/vda 3 resize2fs /dev/vda3

svn下载及使用

下载 链接&#xff1a;https://pan.baidu.com/s/1RV6vAujA1anHhXJuKbItUQ?pwdflzx 提取码&#xff1a;flzx 这是svn安装包以及中文安装包&#xff0c;放在百度网盘了&#xff0c;有需要可以下载 注意&#xff1a;svn中文语言包安装的版本需要和svn的版本一致 他有两种安装…

计算机视觉 3D点云极简概述

一、概述 点云是表示 3D 坐标系中的数字 3D 物理对象或空间的点数据库。它由数百万或者更多个单独的测量点组成,具有 x、y 和 z 坐标。3D点云是物体的高精度数字记录。点云用于生成用于 3D 建模的 3D 网格和其他模型。包括医学成像、3D 打印、制造、建筑、3D 游戏和虚拟现实 (…

RAID5重建失败的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台IBM某型号服务器&#xff0c;4块SAS磁盘组建了一组RAID5磁盘阵列。服务器安装的windows server操作系统&#xff0c;上面运行了一个Oracle单节点&#xff0c;数据存储为文件系统&#xff0c;无归档。该oracle数据库的数据量不大&#xff0c…

UG NX二次开发(C#)-建模-根据特征获取体(或者关联体)

文章目录 1、前言2、创建块特征与UIStyler2.1 创建两个长方体2.2 创建一个UIStyler3、添加获取体的代码1、前言 UG NX的建模是基于特征建模的,比如块、圆柱体、合并操作等等都是特征,都有特征对象,对于具有体的特征,其可以通过NXOpen二次开发技术实现二者的转换,也可以通…

网络编程套接字

目录 网络编程基础 为什么需要网络编程&#xff1f; 什么是网络编程 网络编程中的基本概念 发送端和接收端 请求和响应 客户端和服务端 常见的客户端服务端模型 Socket套接字 概念 分类 Java数据报套接字通信模型 Java流套接字通信模型 Socket编程注意事项 UDP数…

List移除元素的四种方式

List 移除某个元素 四种方式&#xff1a; 方式一&#xff0c;使用 Iterator &#xff0c;顺序向下&#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式二&#xff0c;倒序遍历 List &#xff0c;如果找到元素&#xff0c;则使用 remove 方法进行移除。方式…

括号生成(力扣)递归 JAVA

目录 题目描述&#xff1a;纯递归解法&#xff1a;递归 回溯&#xff1a; 题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a…