【数据结构(二)】顺序表与ArrayList

news2024/11/17 22:15:29

❣博主主页: 33的博客❣
▶文章专栏分类:数据结构◀
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你学更多数据结构知识

在这里插入图片描述

目录

  • 1.前言
  • 2.定义IList接口
  • 3.MyArraylist实现接口
    • 3.1定义成员变量与构造方法
    • 3.2添加元素
    • 3.3 是否包某一个元素
    • 3.4f返回某个值的下标
    • 3.5获取某一个下标的值
    • 3.6删除某一个值
    • 3.7遍历
    • 3.8判空与判满
    • 3.9清除所有元素
  • 4.ArrayList
    • 4.1ArrayList构造
    • 4.2 ArrayList常见操作
    • 4.3 ArrayList的遍历
  • 5.ArrayList具体使用
    • 5.1杨辉三角
    • 5.2简单洗牌算法
  • 6.总结

1.前言

在计算机科学中,数据结构是处理和组织数据的方法和技术。顺序表是一种常见的线性表数据结构,它基于数组实现,提供了快速的随机访问能力。本篇文章将详细介绍顺序表的定义、特点以及常见操作。

本章重点

自己完成一个顺序表,并实现增,删,改,查等操作,实现杨辉三角,简单洗牌算法。


2.定义IList接口

public interface IList {
    //新增元素,默认在数组最后新增
    public void add(int data);
    // 在 pos 位置新增元素
    public void add(int pos, int data);
    // 判定是否包含某个元素
    public boolean contains(int toFind) ;
    // 查找某个元素对应的位置
    public int indexOf(int toFind);
    // 获取 pos 位置的元素
    public int get(int pos);
    // 给 pos 位置的元素设为 value  更新
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public void remove(int toRemove) ;
    // 获取顺序表长度
    public int size();
    // 清空顺序表
    public void clear() ;
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display();

    boolean isFull();

    public boolean isEmpty();
}

3.MyArraylist实现接口

3.1定义成员变量与构造方法

public static final int LEN=10;
    public  int[] arr;
    public int usesize=0;
    public MyArraylist(){
        this.arr=new int[LEN];
    }

3.2添加元素

1.添加元素到末尾

public void add(int data) {
        //检查是否满了,满了就扩容
        if(isFull()){
            chekCapacity();
        }
        arr[usesize]=data;
        usesize++;
    }
public void chekCapacity(){
       arr= Arrays.copyOf(arr,arr.length*2);
    }    

2.指定某一个位置添加

 public void add(int pos, int data) {
       if(isFull()) {
            chekCapacity();
        }
    if(pos<0||pos>=arr.length){
        System.out.println("位置不合法");
    }else {
        for(int i=usesize-1;i>=pos;i--){
            arr[i+1]=arr[i];
        }
        arr[pos]=data;
    }
    usesize++;
    }

测试结果:
在这里插入图片描述


3.3 是否包某一个元素

public boolean contains(int toFind) {
        for (int i=0;i<usesize;i++){
            if(arr[i]==toFind){
                return true;
            }
        }
        return false;
    }

测试结果:
在这里插入图片描述


3.4f返回某个值的下标

public int indexOf(int toFind) {
        for (int i=0;i<usesize;i++){
            if(arr[i]==toFind){
                return i;
            }
        }
        return -1;
    }

测试结果:
在这里插入图片描述


3.5获取某一个下标的值

public int get(int pos) {
 if(pos<0||pos>usesize){
            System.out.println("位置不合法");
        }
 return arr[pos];
 }

测试结果:
在这里插入图片描述


3.6删除某一个值

public void remove(int toRemove) {
    if(isEmpty()){
        System.out.println("已为空,不能删除");
    }else {
        int pos=indexOf(toRemove);
        for(int i=pos;i<usesize-1;i++){
            arr[i]=arr[i+1];
        }
    }
    usesize--;
    }

测试结果:
在这里插入图片描述


3.7遍历

public void display() {
    for (int i=0;i<usesize;i++){
        System.out.print(arr[i]+" ");
    }
    }

测试结果:
在这里插入图片描述


3.8判空与判满

public boolean isFull() {
        return usesize==arr.length;
    }
public boolean isEmpty() {
        return usesize==0;
    }
}

测试结果:
在这里插入图片描述


3.9清除所有元素

public void clear() {
        usesize = 0;
    }

测试结果:
在这里插入图片描述


4.ArrayList

实际上自己实现一个顺序表是非常简单容易的,在数据结构中已经写好了顺序表ArrayList,我们只需要用即可,但我们只有了解底层是如何实现的,才能更好的使用。
在这里插入图片描述
从源码我们可以看出,ArrayList实现了List接口,ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问,.ArrayList实现了Cloneable接口,表明ArrayList是可以clone的,ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。

4.1ArrayList构造

在这里插入图片描述

//无参构造一个空的列表
ArrayList<Integer> list1=new ArratList<>();
//构造一个容量为10的列表
ArrayList<Integer> list2=new ArratList<>(10);
// list3构造好之后,与list中的元素一致,实现了collection接口,为Integer的子类或者本身
ArrayList<Integer> list3=new ArratList<>(list2);

4.2 ArrayList常见操作

在这里插入图片描述


4.3 ArrayList的遍历

rrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器。

 public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    // 使用下标+for遍历
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i) + " ");
    }
    System.out.println();
    // 借助foreach遍历
    for (Integer integer : list) {
        System.out.print(integer + " ");
    }
    //迭代器
    Iterator<Integer> it = list.listIterator();
    while(it.hasNext()){
        System.out.print(it.next() + " ");
    }
    System.out.println();
 }

5.ArrayList具体使用

5.1杨辉三角

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list=new ArrayList<>();
        List<Integer> l=new ArrayList<>();
        //设置第一行的数字
        l.add(1);
        list.add(l);
        for (int i=1;i<numRows;i++){
            //设置每一行第一个元素
            List<Integer> cur=new ArrayList<>();
            cur.add(1);
            List<Integer> pre=list.get(i-1);
            for (int j=1;j<i;j++){
                cur.add(pre.get(j)+pre.get(j-1));
            }
            //设置每一行最后一个元素
            cur.add(1);
            
            list.add(cur);
        }
        return list;
    }
}

5.2简单洗牌算法

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+" ";
    }
}

//买牌、洗牌、发牌

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
//一副新牌
public class CardDemo {
    final String[] suit={"♥","♦","♣","♠"};

    public List<Card> buycard(){
        List<Card> cards=new ArrayList<>();
        for (int i=0;i<4;i++){
            for (int j=0;j<13;j++){
                Card card=new Card(suit[i],j);
                cards.add(card);
            }
        }
        System.out.println(cards);
        return cards;
    }
    //洗牌
public void shuffle(List<Card> cards){
    Random random=new Random();
    for (int i=cards.size()-1;i>0;i--){
       int change=random.nextInt(i);
       //交换i位置与change位置的牌
       Card tmp=cards.get(i);
       cards.set(i,cards.get(change));
       cards.set(change,tmp);
    }
    System.out.println(cards);
}
    //三人轮流拿5张牌
    public void getCard(List<Card> cards){
        List<Card> L1=new ArrayList<>();
        List<Card> L2=new ArrayList<>();
        List<Card> L3=new ArrayList<>();
        List<List<Card>> list=new ArrayList<>();
        list.add(L1);
        list.add(L2);
        list.add(L3);
        for(int j=0;j<5;j++){
            for (int i=0;i<3;i++){
                Card card=cards.remove(0);
                list.get(i).add(card);
            }
        }
        System.out.println("第一个人拿牌");
        System.out.println(L1);
        System.out.println("第二个人拿牌");
        System.out.println(L2);
        System.out.println("第三个人拿牌");
        System.out.println(L3);
    }

}

Test

public static void main(String[] args) {
    CardDemo cardDemo=new CardDemo();
    List<Card> cards=cardDemo.buycard();
    cardDemo.shuffle(cards);
    cardDemo.getCard(cards);
}

6.总结

本篇文章完成一个顺序表,并实现增,删,改,查等操作,实现杨辉三角,简单洗牌算法。

下期预告:链表与LinkedList

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

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

相关文章

Jackson 2.x 系列【14】特征配置篇之 MapperFeature

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 通用2.1 USE_ANNOTATIONS2.2 USE_GETTERS_AS_SETTERS2.3 PROPAGATE_TR…

c 语言 指数搜索(Exponential Search)

该搜索算法的名称可能会产生误导&#xff0c;因为它的工作时间为 O(Log n)。该名称来自于它搜索元素的方式。 给定一个已排序的数组和要 搜索的元素 x&#xff0c;找到 x 在数组中的位置。 输入&#xff1a;arr[] {10, 20, 40, 45, 55} x 45 输出&#xff1a;在索…

多语言婚恋交友APP开发的关键成功因素

随着移动互联网的快速发展&#xff0c;多语言婚恋交友APP的需求和发展逐渐成为了一个备受关注的话题。在全球范围内&#xff0c;人们希望通过移动应用来寻找爱情、建立关系和拓展社交圈子&#xff0c;因此开发一款具有全球影响力的多语言婚恋交友APP成为了许多开发者的目标。针…

支持编写任何类型的爬虫:基于 Golang 的优雅爬虫框架 | 开源日报 No.216

gocolly/colly Stars: 21.5k License: Apache-2.0 colly 是 Golang 的优雅爬虫和爬虫框架。 该项目提供了一个清晰的接口&#xff0c;用于编写任何类型的爬虫/抓取器/蜘蛛。Colly 可以轻松从网站中提取结构化数据&#xff0c;可用于数据挖掘、数据处理或存档等各种应用。 其主…

使用免费开源AI平台:OCR识别抖音短视频及网络图片中文字内容(可本地部署)

在数字化时代&#xff0c;信息的快速获取和处理变得尤为重要。网络图片文字识别技术作为一项重要的人工智能应用&#xff0c;已经在多个领域展现出其独特的价值。本文将基于思通数科AI开放平台提供的网络图片文字识别服务&#xff0c;探讨该技术的应用场景、特色优势以及如何有…

超声波清洗机哪家强?超声波清洗机排行榜!最强超声波清洗机推荐

眼镜作为日常生活中不可或缺的用品&#xff0c;对于很多人来说是必备的。然而&#xff0c;随着使用时间的增长&#xff0c;眼镜表面往往会沾染灰尘、污垢等&#xff0c;这不仅影响了镜片的透光性&#xff0c;也可能影响到使用者的视力和舒适度。因此&#xff0c;清洁眼镜成了一…

PowerShell正则表达式匹配文件内容并输出到屏幕(或保存到文件)

代码&#xff1a; foreach ($line in Get-Content -path .\test.sql) { if ($line -match bdw_\w*.\w*) {write-output $matches[0]}}思路&#xff1a; 读取文件并遍历 foreach ($line in Get-Content -path .\test.sql) 正则匹配 if ($line -match ‘bdw_\w*.\w*’) 这个匹配…

Spring拓展点之SmartLifecycle如何感知容器启动和关闭

Spring为我们提供了拓展点感知容器的启动与关闭&#xff0c;从而使我们可以在容器启动或者关闭之时进行定制的操作。Spring提供了Lifecycle上层接口&#xff0c;这个接口只有两个方法start和stop两个方法&#xff0c;但是这个接口并不是直接提供给开发者做拓展点&#xff0c;而…

Spring的事务详解

Spring的事务详解 一&#xff0c;什么是Spring事务 Spring 事务是 Spring 框架提供的一种对事务进行管理的机制。在使用 Spring 事务时&#xff0c;可以通过注解或编程方式将需要进行事务管理的方法和代码块标记为事务性操作&#xff0c;当这些操作被执行时&#xff0c;Spring…

吴恩达:AI 智能体工作流

热门文章推荐&#xff1a; &#xff08;1&#xff09;《为什么很多人工作 3 年 却只有 1 年经验&#xff1f;》&#xff08;2&#xff09;《一文掌握大模型提示词技巧&#xff1a;从战略到战术巧》&#xff08;3&#xff09;《AI 时代&#xff0c;程序员的出路在何方&#xff1…

人工智能上手 Pytorch

人工智能上手 Pytorch 1、人工智能框架历史走向 2015年&#xff0c; caffe&#xff0c;优势配置简单&#xff0c;缺点安装麻烦&#xff0c;且不更新维护 2016年&#xff0c;tensorflow 1.x&#xff0c;定义太严格&#xff0c;很复杂。开发成本高。简单的任务&#xff0c;也很…

360勒索病毒:变种360袭击了您的计算机?

引言&#xff1a; 随着科技的发展&#xff0c;网络安全问题变得日益突出&#xff0c;勒索病毒成为了当前网络威胁的一大主要形式之一。其中&#xff0c;360勒索病毒是近期备受关注的一种恶意软件。本文将介绍360勒索病毒的特点以及如何有效地应对此类威胁。如果受感染的数据确…

从三个维度看,你的企业是否需要引入精益管理咨询?

在快速变化的商业环境中&#xff0c;企业不断寻求提升自身运营效率和竞争力的方法。其中&#xff0c;精益管理作为一种追求卓越、消除浪费的管理理念&#xff0c;被越来越多的企业所认可。但是&#xff0c;如何判断自己的组织是否需要进行精益企业管理咨询呢&#xff1f;天行健…

I2C驱动实验:读取AP3216C设备中寄存器的数据

一. 简介 经过前面几篇文章的学习&#xff0c;已经完成了I2C驱动框架&#xff0c;字符设备驱动框架&#xff0c;编写了 读写 I2C设备中寄存器的数据的代码&#xff0c;文章如下&#xff1a; I2C驱动实验&#xff1a;实现读/写I2C设备寄存器的函数-CSDN博客 本文在此基础上&a…

Java | Leetcode Java题解之第14题最长公共前缀

题目&#xff1a; 题解&#xff1a; class Solution {public String longestCommonPrefix(String[] strs) {if (strs null || strs.length 0) {return "";}int minLength Integer.MAX_VALUE;for (String str : strs) {minLength Math.min(minLength, str.length…

加入酷开会员 酷开系统带你一起开启看电视的美好时光!

看电视对孩子和大人来说&#xff0c;都是有好处的。英国的《星期日泰晤士报》曾刊登报道&#xff1a;“看电视可以让小孩增长见闻&#xff0c;学习各种良好的社交和学习技巧&#xff0c;从而为他们今后的学习打下良好的基础。”而对于成年人来说&#xff0c;看电视也是一种娱乐…

Flutter开发进阶之错误信息

Flutter开发进阶之错误信息 在Flutter开发中错误信息通常是由Exception和Error表示&#xff0c;Error表示严重且不可恢复的错误&#xff0c;一般会导致程序直接终止&#xff0c;而Exception可以被显式抛出&#xff0c;一般为代码逻辑错误&#xff0c;根据Flutter的解释说Excep…

基于单片机放大电路程控放大特性参数设计

**单片机设计介绍&#xff0c;基于单片机放大电路程控放大特性参数设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机放大电路程控放大特性参数设计是一个结合了单片机编程和放大电路技术的综合性项目。以下是对该设计项目的概…

qgis加载天地图

一、点击Tile Server (XYZ)&#xff0c;选择New Connection 二、在弹出的输入框中输入天地图的url 此处以影像底图为例&#xff0c;url为http://t0.tianditu.gov.cn/img_w/wmts?SERVICEWMTS&REQUESTGetTile&VERSION1.0.0&LAYERimg&STYLEdefault&TILEMATR…

浅析智能数据采集技术在数字化转型中的核心作用|电商数据采集API接口的核心应用

随着科技的飞速发展和全球化的深入推进&#xff0c;数字化转型已经成为企业和社会发展的必然趋势。在这一背景下&#xff0c;智能数据采集技术作为数字化转型的核心驱动力&#xff0c;正发挥着越来越重要的作用。本文将从智能数据采集技术的定义、特点、应用场景以及对企业的影…