数据结构(Java实现)-ArrayList与顺序表

news2024/9/20 9:12:01

什么是List
List是一个接口,继承自Collection。
在这里插入图片描述
在这里插入图片描述


List的使用
List是个接口,并不能直接用来实例化。
如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。


线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。
常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线


顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成
数据的增删查改
在这里插入图片描述


接口的实现
类的成员
在这里插入图片描述
打印顺序表
在这里插入图片描述


在这里插入图片描述
对上述功能进行测试
在这里插入图片描述


在这里插入图片描述
上述两个功能的测试
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


所有代码如下
PosOutBoundsException

public class PosOutBoundsException extends RuntimeException{
    public PosOutBoundsException() {
    }

    public PosOutBoundsException(String message) {
        super(message);
    }
}

SeqList

public class SeqList {
    private int[] elem;
    private int usedSize;记录当前顺序表当中 有多少个有效的数据
    private static  final int DEFAULT_CAPACITY=2;

    public SeqList() {
        this.elem =new int[DEFAULT_CAPACITY];
    }

    //打印顺序表
    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){
        if(isFull()){
            resize();
            System.out.println("扩容成功,当前容量为"+this.elem.length);
        }
        this.elem[usedSize]=data;
        usedSize++;
        System.out.println("尾部添加元素成功");
    }
    public boolean isFull(){
        return usedSize== elem.length;//数组中元素的个数等于数组的长度
    }
    private void resize(){
        elem=Arrays.copyOf(elem,2*elem.length);//第二个参数为拷贝元素长度,如果超出原始数组的长度则补充默认值,如int型则补充0
    }

    //判断报中是否还有某个元素
    public boolean contain(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(elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }

    //获取pos位置的数据
    public int get(int pos){
        if(!checkPos(pos)){
            throw new PosOutBoundsException("get 位置不合法");
        }
        return elem[pos];
    }
    private boolean checkPos(int pos){
        if(pos<0||pos>=usedSize){
            return false;
        }
        return true;
    }

    //获取顺序表的长度
    public int size(){
        return this.usedSize;
    }

    //给pos位置设置为value,为更新数据的意思
    public void set(int pos,int value){
        if(!checkPos(pos)){
            throw new PosOutBoundsException("set 位置不合法");
        }
        this.elem[pos]=value;
    }

    //在pos位置新增元素
    public void add(int pos,int data){
        if(pos<0||pos>this.usedSize){
            throw new PosOutBoundsException("add新增 位置不合法");
        }
        if(isFull()){
            resize();
        }
        //pos位置后的数据后移一位
        for (int i =this.usedSize-1; i>=pos; i--) {
            this.elem[i+1]=this.elem[i];
        }
        //存
        this.elem[pos]=data;
        this.usedSize++;
    }

    //删除第一次出现的数字key
    public void remove(int toRemove){
        if(isEmpty()){
            return;
        }
        int index=indexOf(toRemove);
        if(index==-1){
            return;//没有这个数字
        }
        for (int i =index; i <this.usedSize-1; i++) {
            this.elem[i]=this.elem[i+1];
        }
        this.usedSize--;

    }
    public boolean isEmpty(){
        return this.usedSize==0;
    }

    //清空顺序表
    public void clear(){
        this.usedSize=0;
    }
}

Test1.java

class Test35{
    public static void main(String[] args) {
        SeqList seqList=new SeqList();
        seqList.add(1);
        seqList.add(2);
        seqList.add(3);
        seqList.add(4);
        seqList.add(5);
        seqList.display();
        System.out.println(seqList.contain(5));
        System.out.println(seqList.indexOf(3));
        System.out.println(seqList.indexOf(7));
/*        System.out.println(seqList.size());
        try{
            seqList.set(15,9);
        } catch (PosOutBoundsException e) {
            e.printStackTrace();
            System.out.println("我捕获到了一个异常");
        }*/
        seqList.display();
        seqList.add(4,890);
        seqList.display();
        seqList.remove(890);
        seqList.display();
    }
}

ArrayList简介
ArrayList是以泛型方式实现的,使用时必须要先实例化
ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表


在这里插入图片描述
也可以使用如下创建一个对象
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


ArrayList的构造
在这里插入图片描述


ArrayList常见操作
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


subList方法,会改变原来对象中0位置处的数据,截取拿到的是地址
在这里插入图片描述


ArrayList的遍历
ArrayList 可以使用3种方式遍历:for循环+下标、foreach、使用迭代器
在这里插入图片描述


ArrayList的扩容机制
按照1.5倍方式扩容
如果用户需要扩容大小 超过 原空间1.5倍,按照用户所需大小扩容


ArrayList的具体使用
简单的洗牌算法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
运行结果如下
在这里插入图片描述
全部代码
Card

public class Card {
    //结合成为一张牌
    private String suit;//花色
    private 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 +
                '】';
    }
}

Test

public class Test {
    //设置花色,用于初始化所有牌
    private static final String[] SUITS={"♥","♠","♣","♦"};

    //初始化所有牌
    public static List<Card> buyCard(){
        List<Card> cards =new ArrayList<>();
        for (int i = 0; i <SUITS.length ; i++) {
            for (int j = 1; j <=13; j++) {
                Card card=new Card(SUITS[i],j );
                cards.add(card);
            }
        }
        return cards;
    }

    //洗牌  从最后一张牌开始到倒数第二张牌,随机的与前面的某一张牌交换
    public static void shuffle(List<Card> cards){
        Random random =new Random();//new了一个用于产生随机数的对象
        for (int i =cards.size()-1; i>0 ; i--) {
            int j=random.nextInt(i);//产生[0,i)之间的随机数
            Card temp=cards.get(i);
            cards.set(i,cards.get(j));
            cards.set(j,temp);
        }
    }

    public static void main(String[] args) {
        List<Card> cards =buyCard();
        System.out.println(cards);
        shuffle(cards);
        System.out.println(cards);

        //3个人,每个人轮流揭5张牌
        //每个人最后会得到5张牌,我们用hand1,hand2,hand3来存储每个人的5张牌
        //怎么用来表示每个人呢,这里我们用hand表示,在hand顺序表中,每个元素都是一个人
        //而每个人都有一个顺序表hand1(2,或者3)

        List<Card> hand1=new ArrayList<>();
        List<Card> hand2=new ArrayList<>();
        List<Card> hand3=new ArrayList<>();

        List<List<Card>> hand=new ArrayList<>();

        //将hand1,hand2,hand3添加到hand顺序表中
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        //发牌
        for (int i = 0; i <5; i++) {
            for (int j = 0; j <3; j++) {
                //拿走最上面的一张牌
                Card card=cards.remove(0);
                hand.get(j).add(card);
            }
        }
        System.out.println("第1个人得到的牌");
        System.out.println(hand1);
        System.out.println("第2个人得到的牌");
        System.out.println(hand2);
        System.out.println("第3个人得到的牌");
        System.out.println(hand3);
        System.out.println("剩余的牌");
        System.out.println(cards);

    }

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


利用ArraryList构造出杨辉三角(采用直角三角形的样式)

在这里插入图片描述
同3个人玩扑克牌一样,这里我们也构造出一个二维的顺序表
用ret来存储所有的行,list用来存储每一行的元素
在这里插入图片描述
运行结果如下
在这里插入图片描述


ArrayList的问题及思考
在这里插入图片描述

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

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

相关文章

【安装GPU版本pytorch,torch.cuda.is_available()仍然返回False问题】

TOC 第一步 检查cuda是否安装&#xff0c;CUDA环境变量是否正确设置&#xff0c;比如linux需要设置在PATH&#xff0c;window下环境变量编辑看看&#xff0c;是否有CUDA 第二步&#xff0c;核查python中torch版本 首先查看你环境里的pytorch是否是cuda版本&#xff0c;我这…

深度学习经典检测方法的概述

深度学习经典的检测方法 two-stage&#xff08;两阶段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 两阶段&#xff08;two-stage&#xff09;是指先通过一个区域提取网络&#xff08;region proposal network&#xff0c;RPN&#xff09;生成候选框&#xff0c;再通过…

4.17 如何基于 UDP 协议实现可靠传输?

目录 QUIC 是如何实现可靠传输的&#xff1f; Packet Header QUIC Frame Header QUIC 是如何解决 TCP 队头阻塞问题的&#xff1f; 什么是TCP对头阻塞问题&#xff1a; HTTP/2 的队头阻塞: 没有队头阻塞的 QUIC QUIC 是如何做流量控制的&#xff1f; QUIC 实现流量控制…

变压器绝缘油酸值测试

变压器绝缘油 酸值测试 试验目的 变压器绝缘油的酸值是表明油品中含有酸性物质&#xff0c;即有机酸和无机酸的总值&#xff0c;一般以中和一克变压器油中酸性物质所需的氢氧化钾mg数来表示。 未使用过的新变压器油中基本不含酸性物质&#xff0c;其酸值相当小&#xff0c;但…

Docker 容器学习笔记

Docker 容器学习笔记 容器的由来 早先&#xff0c;虚拟机通过操作系统实现相互隔离&#xff0c;保证应用程序在运行时相互独立&#xff0c;避免相互干扰。但是操作系统又笨又重&#xff0c;耗费资源严重&#xff1a; 容器技术只隔离应用程序的运行时环境但容器之间共享同一个…

数据结构数组栈的实现

Hello&#xff0c;今天我们来实现一下数组栈&#xff0c;学完这个我们又更进一步了。 一、栈 栈的概念 栈是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。 进行数据的插入和删除只在栈顶实现&#xff0c;另一端就是栈底。 栈的元素是后进先出。…

vue2 生命周期,工程化开发入门

一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 二、Vue生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么…

【线程池】ThreadPoolExecutor的使用示例

文章目录 通过ThreadPoolExecutor创建线程池。线程的处理结果如何获取&#xff1f; 通过ThreadPoolExecutor创建线程池。 ThreadPoolExecutor构造方法参数&#xff1a; int corePoolSize //核心线程数量int maximumPoolSize//最大线程数long keepAliveTime//当线程数大于核心…

【谷粒学院】开发篇二:后台管理系统搭建逆向生成代码

后台管理系统介绍 本篇文章主要内容如下&#xff1a; 1.使用人人开源人人开源绞手架搭建后台管理系统的前端和后端框架。 2.使用renren-generator逆向生成微服务&#xff08;gulimall_pms、gulimall_oms、gulimall_sms、gulimall_ums、gulimall_wms&#xff09;的CRUD代码。 …

前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

一、 栈(stack)和 堆(heap) 栈(stack)&#xff1a;是栈内存的简称&#xff0c;栈是自动分配相对固定大小的内存空间&#xff0c;并由系统自动释放&#xff0c;栈数据结构遵循FILO&#xff08;first in last out&#xff09;先进后出的原则&#xff0c;较为经典的就是乒乓球盒结…

机器学习---LDA代码

1. 获取投影坐标 import numpy as npdef GetProjectivePoint_2D(point, line):a point[0]b point[1]k line[0]t line[1]if k 0: return [a, t]elif k np.inf: return [0, b]x (ak*b-k*t) / (k*k1)y k*x treturn [x, y] 该函数用于获取一个点到一条直线的投影点…

以物联网为核心的智慧工地云平台:聚集智能技术,实现建筑工地智慧管理

智慧工地云平台源码&#xff0c;智慧工地项目监管平台源码&#xff0c;智慧工地可视化数据大屏源码 智慧工地云平台是将云计算、大数据、物联网、移动技术和智能设备等信息化技术手段&#xff0c;聚集在建筑工地施工管理现场&#xff0c;围绕人员、机械、物料、环境等关键要素&…

网络安全(黑客)——自学日薪2700

以下是练习舞蹈时长两年半的苕皮哥的故事 你想想一个跨专业的都能拿到日薪2700&#xff0c;你上你也行&#xff0c;那么接下来就是我给大家&#xff0c;整理的网络安全学习思路&#xff0c;让大家斩获高薪&#xff01; 前言&#xff1a; 想自学网络安全&#xff08;黑客技术&am…

秦丝九周年 | 秦丝生产ERP,全新一代服装ERP、SCM

秦丝九周年的主题是“数字生意&#xff0c;经九长兴”&#xff0c;通过数字化工具帮助更多商家开启数字生意&#xff0c;改变传统的低效率的工作&#xff0c;提供更加简单高效地把生意做大做强。 在帮助200万商家通过数字化工具管理零售、批发、连锁门店的同时&#xff0c;秦丝…

_数字矩阵

题目&#xff1a;一个3阶的数字矩阵如下&#xff1a; 1 2 3 8 9 4 7 6 5 现在给定数字n(1<n≤20)&#xff0c;输出n阶数字矩阵。 思路&#xff1a; 放出一条好玩的贪吃蛇&#xff0c;按照右下左上的顺序吃蛋糕&#xff0c;一边吃蛋糕&#xff0c;一边拉数字&#xff1b…

[C++ 网络协议] 套接字的多种可选项

目录 1. 套接字的可选项 2. 获取/设置套接字可选项 2.1 getsockopt函数&#xff08;获取套接字可选项&#xff09; 2.2 setsockopt函数&#xff08;设置套接字可选项&#xff09; 3. 常用套接字可选项 3.1 SOL_SOCKET协议层的SO_TYPE可选项 3.2 SOL_SOCKET协议层的SO_SN…

【八股】2023秋招八股复习笔记4(MySQL Redis等)

文章目录 目录1、MySQLmysql索引实现mysql索引优化mysql索引失效的情况mysql 千万数据优化mysql 事务隔离级别 & 实现原理mysql MVCC版本链&#xff08;undo log&#xff09;mysql数据同步机制 & 主从复制 &#xff08;binlog&#xff09;mysql 日志&数据恢复&…

git及GitHub的使用

文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐&#xff0c;现在用起来比较麻烦)ssh连接&#xff08;推荐&#xff09;git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注&#xff1a; 下载完…

户外跑步用什么耳机、户外运动耳机推荐

跑步是一项简单的运动&#xff0c;只需要交替迈左右腿就可以进行。然而&#xff0c;跑步有时可能变得单调乏味。即使是意志坚定、热爱跑步的人&#xff0c;在这个漫长的过程中也会感到乏味&#xff0c;更不用说像你我这样的普通跑者了。音乐能够让跑步变得更加有趣&#xff0c;…

Java小白基础自学阶段(持续更新...)

引言 Java作为一门广泛应用于企业级开发的编程语言&#xff0c;对初学者来说可能会感到有些复杂。然而&#xff0c;通过适当的学习方法和资源&#xff0c;即使是小白也可以轻松掌握Java的基础知识。本文将提供一些有用的建议和资源&#xff0c;帮助小白自学Java基础。 学习步骤…